デザインモードの整理について

5574 ワード

設計の原則
  • パッケージの変化.
  • は、インターフェースのためにプログラムされ、実装のためにならない.
  • マルチ使用グループ、少ない使用の継承.
  • は、インタラクティブオブジェクト間を緩やかに結合させる.
  • ペアの拡張オープンは、修正のためにオフになります.
  • は抽象に依存し、具体に依存しない.
  • デザインモード
    ポリシーモード
  • 定義:
  • アルゴリズムをカプセル化することで、アルゴリズムの変化をアルゴリズムのクライアントから独立させることができます.
  • アプリケーションシーン:
  • 親クラスが10個のサブクラスに派生したと仮定し、5個のサブクラスがある場合にはアルゴリズムAを追加する必要がある場合、この機能を親クラスに追加するのは明らかに不適切である.他の5つはアルゴリズムAを必要としないからである.この5種類のアルゴリズムを一つずつ加えると、コードの冗長性がひどくなります.この5つの種類と父類の間にもう一つの父類を追加したらどうですか?見たところいいですが、この5種類の中に3つのアルゴリズムBを追加すればいいですか?このような拡張は全体構造にとって非常に柔軟ではない.この時は戦略モードが役に立ちました.
  • 実施形態:
  • アルゴリズムA、アルゴリズムBなどをパッケージ化して、同じインターフェースを継承して、親の中でこのインターフェースの引用を宣言します.子供たちは自分の需要に応じてインタフェースの実例化ができます.このようなアルゴリズム族を組み合わせて,構造をより弾性的にした.
    観察者モード
  • 定義:
  • オブジェクト間で1対の多依存性を定義し、オブジェクトの状態を変更すると、他のオブジェクトは通知を受けて自動的に更新されます.
  • アプリケーションシーン:
  • ラジオやUIイベントの傍受など、イベント伝達に広く適用される.観察者は誰が観察に加わるかに関心を持たず、観察者によって観察の仲間入りを決める.
  • 実施形態:
  • 観察者はinterfaceを定義し、自身の状態が変化したときにinterfaceを呼び出して観察者に通知する.対象となるには観察者として実用化されたinterfaceだけが必要で、観察者に与えられます.
    装飾者モード
  • 定義:
  • 動的に責任を対象に付加する.これは継承とは別の拡張機能を持つ方式です.
  • アプリケーションシーン:
  • 父類Aが派生したサブクラスは非常に多く、サブクラスの間にはBC、CD、BDなどの様々な同じ特性の混合関係が存在する.これらの特性は、B、C、Dのように独立してパッケージ化することができます.サブクラスの数を最小に圧縮し、異なるニーズに応じてパッケージの特性をサブクラスに追加します.
  • 実施形態:
  • class A {
    		public void do() {
    			return 0.1;
    		};
    	}
    	class B extends A {
    		A a;
    		public B (A a) {
    			this.a = a;
    		}
    		public void do() {
    			return 0.1 + a.do();
    		};
    	}
    	class C extends A {
    		A a;
    		public C (A a) {
    			this.a = a;
    		}
    		public void do() {
    			return 0.2 + a.do();
    		};
    	}
    	public static int main(String args[]) {
    		A a = new A();
    		a = new B(a);	// B  a
    		a = new C(a);	// C  a
    	}
     
     

    工厂模式

    • 定义:

    定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,让类的实例化推迟到子类。通常包括工厂方法和抽象工厂方法,前者主要以继承方式让子类决定产品类型(也包括简单工厂,即不需要派生子类,直接提供产品),后者则通过接口方式组合各种产品对象。

    • 应用场景:

    当只有在运行时才知道需要实例化的是哪个类,我们就可以把这种类型判断和对象创建采用工厂方法封装起来。工厂方法用于创建具体的产品,抽象工厂用于定义整个产品家族的创建接口。而后者派生出的具体工厂则是工厂方法。

    • 实现方式:

    简单工厂方法

    public static class Factory {
    		public static A createObj(int type) {
    			if (type == 0) return new B();		//B extends A
    			else if (type == 1) return new C();	//C extends A
    		}
    	}
    工場の仕様
    public abstract class Factory {
    		public A orderObj(int type) {
    			A a = createObj(type);
    			a.init();
    			a.doSomething();
    			return a;
    		}//              
    		abstract A createObj(int type);
    		//    
    	}
     
     

    抽象工厂方法

    public interface Factory {
    	public A createA();
    	public B createB();
    }
    public class MyFactory implements Factory {
    	public A createA() { return new A(); }
    	public B createB() { return new B(); }
    }
    
    シングルモード
  • 定義:
  • 一つのクラスが一例だけであることを保証し、全体的なアクセスポイントを提供する.
  • アプリケーションシーン:
  • いくつかのクラスは、より良い制御プログラムの例が必要ですが、多くなると、プログラムの異常、リソースの過剰使用、または不一致などの問題が発生します.スレッドプール、キャッシュ、ダイアログ、ログオブジェクトなど.
  • 実施形態:
  • public class Singleton {
    	private static Singleton instance;
    	//        ,     
    	private Singleton() {
    	}
    	//     
    	public static Singleton getInstance(){
    		if (instance == null) {
    			//       (                ,              。              )
    			instance = new Singleton();
    		}
    		return instance;
    	}
    }
    コマンドモード
  • 定義:
  • 「要求」をオブジェクトにカプセル化して、他のオブジェクトをパラメータ化するために、異なる要求、列またはログを使用します.キャンセル可能な操作もサポートします.
  • アプリケーションシーン:
  •  多くの動作実行者がいると仮定して、それらはそれぞれ異なる動作動作動作動作をしており、それらに動作要求を送信するには、多くの動作要求者が必要である.コマンドモードにより、「動作要求者」を「動作実行者」オブジェクトから切り離すことができます.
  • 実施形態:
  • //     
    public class Actor {
    	public void do() {
    		//do something
    	}
    	public void reset() {
    		// reset state
    	}
    }
    //    
    public interface Command {
    	public void execute();
    	public void undo();
    }
    public class ActorCommand implements Command {
    	Actor a;
    	public ActorCommand(Actor a) {
    		this.a = a;
    	}
    	public void execute() {
    		a.do();
    	}
    	public void undo() {
    		a.reset();
    	}
    }
    //     
    public class RemoteControl {
    	Command cmd;
    	public void setCommand(Command cmd) {
    		this.cmd = cmd;
    	}
    	public void doCommand() {
    		cmd.execute();
    	}
    	public void cancel() {
    		cmd.undo();
    	}
    }
    public static void main(String[] args) {
    	RemoteControl remote = new RemoteControl();
    	Actor a = new Actor();
    	ActorCommand cmd = new ActorCommand(a);
    	remote.setCommand(cmd);//         
    	remote.doCommand();
    	remote.cancel();
    }
    アダプタモード
  • 定義:
  • 一つのインターフェースを顧客が望む別のインターフェースに変換する.元の互換性のないクラスに協力してください.
  • アプリケーションシーン:
  • ソフトウェアシステムが古いモジュールがあると仮定して、新しいメーカーが提供するモジュールとシステムのインターフェースが一致するときに、新しいメーカーが提供するモジュールに変更する必要があります.アダプターモードでインターフェースを変換します.ソフトウェアシステムと新しいモジュールは何の修正もしないでマッチングができます.
  • 実施形態:
  • public interface A {
    	public void walk();
    	public void run();
    }
    public interface B {
    	public void walk();
    	public void fly();
    }
    // B    A  
    public class BAdapter implements A {
    	B b;
    	public BAdapter(B b) {
    		this.b = b;
    	}
    	public void walk() {
    		b.walk();
    	}
    	public void run() {
    		b.fly();	
    	}
    }
  • 外観モード
  • もう一つの実施形態はアダプタと同様のモードがあるが、インターフェースを簡略化することを目的としている.外観モードは、サブシステム内のインターフェースのグループにアクセスするための統一インターフェースを提供する.それは高いレベルのインターフェースを定義して、サブシステムがより使いやすいようにします.
  • 比較
  • 装飾者モードと似ていますか?これら3つを比較してもいいです.
    モード
    意図
    飾り物師
    インターフェースを変えませんが、行動責任に加入します.
    アダプター
    一つのインターフェースを別のインターフェースに変えます.
    外観
    インターフェースを簡単にします
    引き続き……