Head First Design Patterns


1.設計原則パッケージの変化
インタフェースに対してプログラミングして、実装に対してプログラミングしないでください
マルチコンビネーション、継承を少なくする
インタラクティブオブジェクト間の松結合設計のために努力する
クラスは拡張に対して開くべきで、修正に対して閉じるべきです
抽象に依存するには、特定のクラスに依存しない-依存逆原則(Dependency Inversion Principle)
友達とだけ話す
私を探さないで、私はあなたを探します
クラスを変える理由は一つだけ
 
 
2.ポリシーモード(Strategy)
アルゴリズムファミリーを定義し、それぞれをカプセル化し、それらを互いに置き換えることができ、アルゴリズムの変化をアルゴリズムを使用する顧客-アヒルシミュレータとは独立させる.
 
 
3.オブザーバーモード(Observer)
オブジェクト間の1対のマルチ依存性を定義し、1つのオブジェクトの状態が変化すると、すべての依存者が通知を受けて自動的に更新されます.気象観測局オブザーバモード(Observer)=出版者(Subject)+サブスクライバ(Observer)
   
Javaにはオブザーバーモードが内蔵されていますjava.util.Observer(Observerと同じ)とjava.util.Observable(Subjectと同じ).3.1観察者オブジェクト実装javaをどのように定義するか.util.Observerインタフェース、Observableを呼び出す.addObserver()観察者を追加し、Observableを呼び出す.deleteObserver
()観察者3.2が拡張Observableインタフェースを適用することをどのように通知するかを削除し、setChanged()メソッドタグ状態の変更を呼び出し、次に2つのnotifyObservers()または
notifyObservers(Object arg)の3.3の観察者が観察者に通知するupdate(Observable o,Object arg)メソッドをどのように受け入れるかをプッシュ(push)データが観察者に与えられると、notifyObservers(Object arg)メソッドを呼び出し、観察者がアクティブにプル(pull)すると、トピッククラスでsetChanged()を呼び出し、notifyObservers()を呼び出し、同時にすべてのパラメータを
観察者が取得できるようにgetXXXメソッドを出す
//     -          ,  ,  
interface Subject {
    registerObserver()
    removeObserver()
    motifyObservers()
}

//      -     update()  ,          
interface Observer {
    update()
}

//     -     ,  ,  ,          
ConcreteSubject implements Subject {
    registerObserver() {...}
    removeObserver(){...}
    motifyObservers(){...}
    getState()
    setState()
}

//      -         
ConcreteObserver implements Observer {
    update()
}

 
 
4.デコレーションモード(Decorator)
動的にオブジェクトに責任を付加します.機能を拡張するには、装飾者が継承よりも弾力性のある代替案を提供しています.スターバーズコーヒーJava I/Oは典型的な装飾器モードです.
//Component -     
Component {
    methodA()
    methodB()
}

//ConcreteComponent -     
ConcreteComponent extends Component {
    methodA()
    methodB()
}

//Decorator -        
Decorator extends Component {
    methodA()
    methodB()
}

//ConcreteDecoratorA
ConcreteDecoratorA extends Decorator {
    Component wrappedObj  //         
    methodA()
    methodB()
    newBehavior()
}

//ConcreteDecoratorB
ConcreteDecoratorB extends Decorator {
    Component wrappedObj  //         
    Object newState  //       Component  
    methodA()
    methodB()
}

 
 
5.ファクトリメソッドモード(Facotory Methods)
オブジェクトを作成するインタフェースを定義しますが、インスタンス化するクラスがどれであるかはサブクラスによって決まります.工場方法はクラスに実例化をサブクラス-ピザ店単純工場(Simple Factory):一つの工場クラス、一つの抽象製品クラス、一連の具体的な製品クラス工場方法(Factory Method):一つの抽象工場クラス、一連の具体的な工場クラス、一つの抽象製品クラス、一連の特定のプロダクトクラス抽象ファクトリ(Simple Factory):特定のクラスを指定することなく、関連または依存オブジェクトのファミリーを作成するインタフェースを提供します.作成
一つの家族は、製品が多いことを説明しています.抽象工場のすべての方法は工場の方法のように見えます.だから、抽象工場は製品を作成するインタフェースを定義し、工場の方法で実現します.
 
 
6.単例モード(Singleton)
クラスが1つのインスタンスしかないことを確認し、グローバルアクセスポイント-チョコレート工場を提供します.
 
 
7.コマンドモード(Command)
リクエストをオブジェクトにカプセル化し、別のリクエスト、キュー、またはログを使用して他のオブジェクトをパラメータ化し、取り消し操作をサポートします.
 
Client:クライアントは、Receiver Invoker:呼び出し元がコマンドオブジェクトを持ち、execute()メソッドを実行するCommand:インタフェースConcreteCommand:具体的な実行者は、ReceiverメソッドReceiverを呼び出します:必要な作業を行います
Undo操作を行うことができ、特定のコマンドに前の状態を記録し、それから相応の方法を追加し、元の状態マクロコマンドに再設定することができる:特定のコマンドの山を1つの方法に置いて実行することもできるし、コマンドモードをキュー要求に使用することもでき、1つのスレッドがキューからタスクを取り出すこともできる.次にexecute()ログ要求を実行します:各コマンドが実行されると、ステータスをディスクに格納できます.Down後、リカバリできます.
 
 
8.アダプタモード(Adapter)
1つのクラスのインタフェースを、お客様が望む別のインタフェースに変換し、元のインタフェースが互換性のないクラスが協力できるようにします.アヒルと七面鳥アダプタは、異なるインタフェースを変換するだけで、装飾器に新しい方法が加わる可能性があります.
 
 
9.外観モード(Facade)
統合されたインタフェースを提供し、サブシステムのインタフェース-ホームシアターに問い合わせて一連の操作を実行するなど、外観モードを使用して、すべての操作をカプセル化し、クライアントに方法を呼び出すことができます.
 
 
10.テンプレートメソッド(Template)
1つの方法でアルゴリズムのスケルトンを定義し、いくつかのステップをサブクラスに遅延させる-コーヒーとお茶の作り方は自分で一部の方法を実現することができ、他のいくつかの方法はサブクラスで実現することができ、親クラスで抽象的な方法を定義し、サブクラスに実行させる.
//   
abstract class AbstractClass {
    //   final,         
    final void templateMethdo() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook(); 
    }
    //        ,     
    abstract void primitiveOperation1();
    abstract void primitiveOperation2();
    
    void concreteOperation() {
    }
    
    void hook() {}  //           
}

 
 
11.ハリウッドの原則
抽象コンポーネントは、低層コンポーネントが抽象コンポーネントに依存しないように、低層コンポーネントをいつ使用するかを決定します.
ポリシーとテンプレートはアルゴリズムをカプセル化し、ポリシーは組合せで、テンプレートは継承を使用します.
 
 
12.反復器(Iterator)
集約オブジェクト内の各要素に順次アクセスし、その内部の表現を露出しない方法を提供します.
 
 
13.コンビネーション(Component)
オブジェクトをツリー構造に結合して、全体/部分階層を表現できます.コンビネーションは、お客様が個別のオブジェクトとオブジェクトのコンビネーションを一貫した方法で処理できるようにします.オブジェクト村のメニュー
 
 
14.ステータスモード(State)
オブジェクトが内部状態を変更したときに動作を変更できるようにします.オブジェクトはクラスを変更したように見えます.万能キャンディ販売機
 
 
15.エージェントモード(Proxy)
別のオブジェクトの代替またはプレースホルダを提供して、このオブジェクトへのアクセスを制御するリモートエージェント:JVMオブジェクトのローカル代表として、プロキシメソッドを呼び出し、リモートオブジェクトメソッドを実行できます.例えば、リモートモニタリング万能キャンディマシン仮想エージェント:コストの高いオブジェクト代表を作成します.例えばCDブラウザでは、別のスレッドを有効にし、ネット上からCDジャケットの動的エージェントjavaをダウンロードする.lang.reflect、実行時にエージェントクラスを動的に作成し、複数のインタフェースを実現し、メソッドの呼び出しを指定したクラス保護エージェントに転送します.権限のあるユーザーにアクセスさせます.
 
 
16.複合モード(Component)
2つ以上のパターンを組み合わせて,すでに発生している一般的な問題を解決するソリューションを構成する.MVCは観察者モード,戦略モード,組合せモードを結合した.