banner
jzman

jzman

Coding、思考、自觉。
github

外観デザインパターン

PS:入力が出力を促す。持続的に出力したいなら、持続的に入力しなければならない。毎日の努力は小さいが、もし 1 年続けたら、さらにはそれ以上続けたら、結果は必ずしも美しいとは限らないが、過程は必ず充実している。

今日は外観デザインパターンを復習します。外観デザインパターンに触れると、デザインパターンの 6 つの原則の 1 つであるディミテルの法則について触れざるを得ません。本記事では、以下の点から外観デザインパターンを紹介します:

  1. ディミテルの法則
  2. 外観デザインパターンの理解
  3. 外観デザインパターンの実装

ディミテルの法則#

開発中にクラス間の関係がますます密接になり、結合度が高くなり、1 つのクラスが変更されると他のクラスにも影響を及ぼすことがよくあります。デザインパターンの 6 つの原則の中で、ディミテルの法則はこの現象を規範するために用いられます。では、ディミテルの法則とは何でしょうか?

ディミテルの法則(Law of Demeter)は、最小知識原則(LKP、Least Knowledge Principle)とも呼ばれ、あるオブジェクトは他のオブジェクトに対して最小限の理解を持つべきであるということです。

ディミテルの法則には、よりシンプルな定義もあります:直接の友人とだけ通信すること。直接の友人とは、2 つのオブジェクト間に結合関係がある場合、これらのオブジェクト間は友人関係にあると言います。結合関係には依存、コンポジション、アグリゲーションなどがあり、メンバー変数、メソッドパラメータ、メソッドの戻り値に現れるクラスを直接の友人と呼びます。一方、ローカル変数に現れるオブジェクトは直接の友人ではありません。つまり、知らないクラスはローカル変数に現れない方が良いのです。

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

外観デザインパターンは、実際には開発中にすでに使用されていますが、潜在意識の中で外観デザインパターンという概念はありません。例えば、便利に呼び出すためにいくつかの機能をカプセル化し、最終的に管理クラスで外部に統一して提供することです。ほとんどのツールクラスは外観デザインパターンを使用しているはずです。

根本的に言えば、外観デザインパターンは、広く使用される機能をカプセル化し、この部分の内容が他のオブジェクトと頻繁に結合関係を持つことを避け、サブシステムの複雑さをカプセル化して外部に 1 つのエントリを提供し、他のモジュールが呼び出せるようにすることです。これが外観デザインパターンの核心です。

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

シーン:茶館には 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("ウーロン茶");
    }
}

実行ログは以下の通りです:

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

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

外観デザインパターンの学習はここまでです。普段の業務開発でもこのように書くことがあるかもしれませんが、潜在意識の中ではディミテルの法則や外観デザインパターンを知らないかもしれません。このような概念を入力することで、潜在意識の中でこのようなルールを実践し、自分のコーディング能力を向上させることができます。

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