banner
jzman

jzman

Coding、思考、自觉。
github

外観デザインパターン

PS:入力による出力を促進するため、継続的な出力を維持するためには、毎日の継続は小さいですが、1 年以上、さらに長い時間を継続すると、結果は必ずしも素晴らしいとは限りませんが、プロセスは確かに充実しています。

今日は外部デザインパターンを復習し、外観デザインパターンに触れると、デザインパターンの 6 つの原則の 1 つであるローディング法則に触れざるを得ません。この記事では、次のような側面から外観デザインパターンを紹介します。

  1. ローディング法則
  2. 外観デザインパターンの理解方法
  3. 外観デザインパターンの実装

ローディング法則#

開発中には、クラス間の関係がますます密接になり、結合が大きくなり、1 つのクラスの変更が他のクラスに影響を与えることがあります。デザインパターンの 6 つの原則の 1 つであるローディング法則は、このような現象を規制するために使用されます。では、ローディング法則とは何でしょうか?

ローディング法則(Law of Demeter)は、最小限の知識原則(LKP、Least Knowledge Principle)とも呼ばれ、オブジェクトは他のオブジェクトに対して最小限の知識を保持するべきであると述べています。

ローディング法則には、より簡単な定義もあります:直接の友人とのみ通信するというものです。直接の友人とは、2 つのオブジェクト間の結合関係を指します。結合関係には依存、組み合わせ、集約などがあります。メンバ変数、メソッドパラメータ、メソッドの戻り値に現れるクラスを直接の友人と呼びますが、ローカル変数に現れるオブジェクトは直接の友人ではありません。つまり、ローカル変数には見知らぬクラスが現れないようにするべきです。

外観デザインパターンの理解方法#

外観デザインパターンは実際には開発中に既に使用されていますが、潜在的には外観デザインパターンという概念はありません。たとえば、いくつかの機能を便利に呼び出すためにラップすることがありますが、最終的には管理クラスで統一的に提供されます。ほとんどのユーティリティクラスは、外観デザインパターンを使用する必要があります。

根本的には、外観デザインパターンは広く使用されている機能をラップし、この部分の内容が他のオブジェクトと頻繁に結合関係を持たないようにするためのものです。サブシステムの複雑さをカプセル化し、他のモジュールが呼び出せるようにするために、外部からの入り口を提供するだけです。これが外観デザインパターンの核心です。

外観デザインパターンの実装#

シナリオ:茶室には A、B、C などの顧客がお茶を飲むためにお茶を淹れる必要があります。そして、各顧客がお茶を淹れるたびに次の手順を経る必要があります:

  1. 用具の準備
  2. 水の準備
  3. 淹れる

各顧客がお茶を淹れるたびに、茶具、茶葉、お湯などに接触するのは明らかにローディング法則に違反しています。外観デザインパターンを使用して、お茶を淹れるこのプロセスをカプセル化することができます。つまり、茶室のサーバーです。お茶を飲むたびに、顧客は単に茶室のサーバーに飲みたいお茶を伝えるだけで、お茶を淹れる他の詳細を知る必要はありません。ただし、希望のお茶を飲むことができれば十分です。以下は、この例を使用して外観デザインパターンを簡単に実装する方法です。お茶の淹れ方は次のとおりです:

/**
 * 用具の準備
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareTeaSet {
    void prepareTeaSet();
}

class PrepareTeaSet implements IPrepareTeaSet {
    @Override
    public void prepareTeaSet() {
        System.out.println("用具の準備...");
    }
}

/**
 * 水の準備
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareWater {
    void prepareWater();
}

class PrepareWater implements IPrepareWater {
    @Override
    public void prepareWater() {
        System.out.println("水の準備...");
    }
}

/**
 * 淹れる
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IBrewMethod {
    void brewMethod(String tea);
}

class BrewMethod implements IBrewMethod {

    @Override
    public void brewMethod(String tea) {
        System.out.println("淹れる..."+tea);
    }
}

お茶のサービスを統一的にラップして提供するために、次のようにします:

/**
 * 茶室のお茶のサービス
 * Created by jzman
 * Powered by 2019/5/6.
 */
class TeaHouse {
    // 統一的なお茶のサービス
    public static void drinkTea(String tea){
        // 用具の準備
        new PrepareTeaSet().prepareTeaSet();
        // 水の準備
        new PrepareWater().prepareWater();
        // 淹れる
        new BrewMethod().brewMethod(tea);
    }
}

最後に、顧客は飲みたいお茶を注文するだけです:

/**
 * テスト
 * Created by jzman
 * Powered by 2019/5/6.
 */
class FacadeMain {
    public static void main(String[] args) {
        // A
        TeaHouse.drinkTea("紅茶");
        // B
        TeaHouse.drinkTea("ウーロン茶");
    }
}

実行ログは次のようになります:

用具の準備...
水の準備...
淹れる...紅茶

用具の準備...
水の準備...
淹れる...ウーロン茶

外観デザインパターンの学習はここで終わりです。通常のビジネス開発でもこのように書くことがあるかもしれませんが、潜在的にはローディング法則や外観デザインパターンについては知りません。このような概念を入力することで、潜在意識の中でこのようなルールを実践し、自分のコーディング能力を向上させることができます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。