デザインモード-----ポリシーモード


デザインモード-–ポリシーモード
個人ブログ、個人ブログを作りたい人は入ってみてもいいです.http://www.ioqian.top/
OOP設計は多重化可能、拡張可能、メンテナンス可能でなければならない.
背景にはたくさんのアヒルのことを説明するソフトがありますが、主に水泳、どのような外観、飛行の動きが含まれていますか?
1使用相続
public class DemoOne {
    //    
    abstract class Duck{
        public void Duck(){}
        //              ,    
        public void swim(){
            System.out.println("All duck can swim");
        }
        //           ,   one one one ,    two two two(    ),       
        public void fly(){
            System.out.println("i can fly by one one one");
        }
        //             ,        
        public abstract void display();
    }
    //         ,   
    class WhiteDuck extends Duck{
        //     two two two ,        
        @Override
        public void fly() {
            System.out.println("i can fly by two two two");
        }
        //      ,    
        @Override
        public void display() {
            System.out.println("i am a white duck");
        }
    }
     //        
    class NoFly extends Duck{
        //       fly()   
        @Override
        public void fly() {
        }
        //      ,    
        @Override
        public void display() {
            System.out.println("i am a white duck");
        }
    }
}
注意してください.fly()とdisplay()は方法が違っています.アヒルのfly()の行動は三つしかありません.一つはone oneで、一つはtwo two twoで、最後は飛びません.でも、アヒルのdisplay()は方法が違います.以下の改善はこの仮説に基づいています.
この問題を解決したように見えますが、ソフトウェア開発において唯一不変なのはCHANGEです.後に100種類以上のアヒルの種類を追加する必要があります.私たちは100種類のアヒルの種類の中のfly()とdisplay()の方法を書き換える必要があります.
2.使用インターフェース
public class Demotwo {
    //        ,            
    interface FlyBehavior{
        public void fly();
    }
    abstract class Duck{
        public void Duck(){}
        //              
        public void swim(){
            System.out.println("All duck can swim");
        }
        //             
        public abstract void display();
    }
    //     ,       
    class WhiteDuck extends Duck implements FlyBehavior{
        @Override
        public void display() {
            System.out.println("i am a white duck");
        }
        @Override
        public void fly() {
            System.out.println("i can fly by two two two");
        }
    }
    //    ,      
    class NoGreenFlyDuck extends Duck{
        @Override
        public void display() {
            System.out.println("i am a Green duck");
        }
    }
}
この設計と上の使用の改良点は、飛行できないアヒルに対して空の方法として書き換える必要がないという点です.しかし、コード屯余はまだ多く、多くの繰り返し飛行行為を書きます.FlyBehaviorインターフェースが変わると、FlyBehaviorインターフェースを継承するすべての種類が変わります.これは怖いです.
3.ポリシーモード
コードの前にまずいくつかの感想を紹介します.
策略のモード、計算方の族を定義して、それぞれカプセル化して、彼らの間に互いに交換することができて、この設計のモードは計算方の変化を独立してと計算方の取引先を使用させます.分かりやすい言い方は、アルゴリズムのセットを用意して、パッケージの変更の設計原則を交換して、アプリケーションの中で変化が必要な部分を見つけて、独立して、変化が必要でないコードと混在しないでください.プログラミングを実現するために多くの組み合わせを使うのではなく、設計の原則を受け継ぐのは少ないです.
//FlyBehavior.java
public interface FlyBehavior {
    public void fly();
}
//FlyNo.java
public class FlyNo implements FlyBehavior {
    @Override
    public void fly() {
    }
}
//FlyOne.java
public class FlyOne implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("i can fly by one one one");
    }
}
//FlyTwo.java
public class FlyTwo implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("i can fly by two two two");
    }
}
//Duck.java
public abstract class Duck {
    FlyBehavior mFlyBehavior;
    public Duck() {
    }
    //             ,          
    public abstract void display();
    //    
    public void swim(){
        System.out.println("All duck can swim");
    }
    //         ,      
    public void fly(){
       if(mFlyBehavior != null){
           mFlyBehavior.fly();
       }
    }
    //   setter            ,         
    public void setmFlyBehavior(FlyBehavior mFlyBehavior) {
        this.mFlyBehavior = mFlyBehavior;
    }
}
//  Main.java    
public class Main {
    //                ,          
    static class FlyWhiteDuck extends Duck{
        @Override
        public void display() {
            System.out.println("i am a white duck");
        }
    }
    public static void main(String[] args) {
        Duck flyOneWhiteDuck = new FlyWhiteDuck();
        //fly()              
        flyOneWhiteDuck.setmFlyBehavior(new FlyOne());
        flyOneWhiteDuck.fly();
        flyOneWhiteDuck.setmFlyBehavior(new FlyTwo());
        flyOneWhiteDuck.fly();
        flyOneWhiteDuck.setmFlyBehavior(new FlyNo());
        flyOneWhiteDuck.fly();
    }
}
テストの結果、fly()の挙動を変えることができることが分かりました.
i can fly by one one one
i can fly by two two two
//        ,    null
Process finished with exit code 0
締め括りをつける
一つのクラスの異なる行為に対して、三つの種類に分けられます.すべてのサブクラスは同じで、直接に親類で実現されます.上述のswim()方法-すべてのサブクラスは違っています.直接に抽象的な方法に書きます.各サブクラスは自分で実現します.上記display()方法-すべてのサブクラスは少数の選択しかありません.