デザインモード---ポリシーモード(組み合わせ)


ポリシーモード(パッケージアルゴリズムを組み合わせることによって、いくつかの特性を他の人に委託して処理する)を定義します.アルゴリズム家族を定義して、それぞれカプセル化して、彼らの間で互いに交換することができます.このモードはアルゴリズムの変化をアルゴリズムを使用するクライアントと独立させます.(アルゴリズムはある挙動特性としても理解できる)
  • 継承のメリット:共通部分を多重化して、プログラムの重複を避ける.
  • 継承の悪い:結合性が高い.一旦超種類に新しい方法を追加したら、サブクラスが継承され、この方法を持っている.もしサブクラスの相当部分がこの方法を実現しないなら、大量の修正が必要である.また、継承を採用する場合、サブクラスは他のクラスを引き継ぐことができなくなる.
  • インターフェースの利点:引継ぎ結合性の高い問題を解決し、実装クラス、引継ぎまたは他のクラスまたはインターフェースを実装することができます.
  • インターフェースの不具合:コードの多重化を実際に実現できない.以下のポリシーモードで解決できます.特性を追加しないと、インターフェースの実現
  • を追加する必要があります.
    構造方法において属性を付与することと属性を使用することとの違い:構造方法において属性を付与すること:固定、可変ではない.属性のsetterを使って、対象を具体化した後で、ダイナミックな変化ができます.
    設計原則:1、応用の中で変化が必要かもしれないところを探し出して、彼らを独立させて、彼らを変化のコードがいらないことと混ぜ合わないでください.2、インターフェースプログラミングに対して、プログラミングを実現するためのものではなく、多用途の組み合わせを実現するために、継承を少なくする.
    クラス間の関係は一つです.引き継ぎは一つあります. 
    //   
    public abstract class Duck {
         QuackBehavior quackBehavior;
         FlyBehavior flyBehavior;
    
    
         public Duck() {
         }
         public abstract void display();
         //            
         public void performFly() {
              flyBehavior.fly();
         }
         public void performQuack() {
              quackBehavior.quack();
         }
         public void swim() {
              System.out.println("swimming.....");
         }
         //  set    
         public void setQuackBehavior(QuackBehavior quackBehavior) {
              this.quackBehavior = quackBehavior;
         }
         public void setFlyBehavior(FlyBehavior flyBehavior) {
              this.flyBehavior = flyBehavior;
         }
    }
    //        
    public class MallardDuck extends Duck {
    
         //        
         public MallardDuck() {
              quackBehavior = new Quack();
              flyBehavior = new Flywithwings();
         }
    
         @Override
         public void display() {
              System.out.println("i am a real MallardDuck.....");
    
         }
    
    }
    
    //  1       
    public interface QuackBehavior {
         public void quack();
    }
    
    public class Quack implements QuackBehavior {
    
         @Override
         public void quack() {
              System.out.println("quack.....");
    
         }
    
    }
    public class NuteQuack implements QuackBehavior {
    
         @Override
         public void quack() {
              System.out.println("silence.....");
         }
    
    }
    
    //  2       
    public interface FlyBehavior {
         public void fly();
    }
    public class Flynoway implements FlyBehavior {
    
         @Override
         public void fly() {
              System.out.println("fly no way.....");
    
         }
    
    }
    public class Flywithwings implements FlyBehavior {
    
         @Override
         public void fly() {
              System.out.println("fly with wings.....");
    
         }
    
    }
    //  
    public class T {
    
         /**
          * @param args
          */
         public static void main(String[] args) {
              Duck mallard = new MallardDuck();
              mallard.performFly();
              mallard.performQuack();
    
         }
    
    }
      :
    fly with wings.....
    quack.....
    
    参考:
    『head first設計モード』
    http://www.importnew.com/23503.html