設計模式(1) 策略模式

策略模式:策略模式定義了算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。

需求: 設計一些可以動態改變的鴨子。

設計一些行爲類

FlyBehavior.java (飛行動作接口,所有飛行行爲必須實現該類)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */

//所有飛行行爲必須實現該接口
public interface FlyBehavior {
    public void fly();
}
FlyWithWings(飛行行爲類,用翅膀飛)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class FlyWithWings implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("我可以用翅膀飛!");
    }
}
QuackBehavior.java(叫行爲接口,所有叫聲行爲都必須實現該類)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */

//實現叫聲的接口
public interface QuackBehavior {
    public void quack();
}
Quack.java (叫聲行爲類,呱呱叫)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class Quack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("呱呱叫!");
    }
}
MuteQuack.java(叫聲行爲類 ,不會叫的)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class MuteQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("我不會叫!");
    }
}

設計鴨子抽象類

Duck.java(鴨子抽象類,所有鴨子的實現都必須基於該類)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public abstract class Duck {

    public FlyBehavior getFlyBehavior() {
        return flyBehavior;
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public QuackBehavior getQuackBehavior() {
        return quackBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    FlyBehavior flyBehavior;

    QuackBehavior quackBehavior;

    //必須實現聲明類別的方法
    public abstract void display();

    //將叫和飛委託給行爲類

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack(){
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("所有的鴨子都會游泳!");
    }
}

設計一些具體鴨子

ModelDuck.java(模型鴨,不會飛,不會叫)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class ModelDuck extends Duck {
    public ModelDuck(){
        //不會飛
        flyBehavior=new FlyNoWay();
        //不會叫
        quackBehavior=new MuteQuack();
    }

    @Override
    public void display() {
        System.out.println("我是一隻模型鴨,不會飛,不會叫!");
    }
}
TrueDuck.java(真正的鴨子,會飛,會叫)
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class TrueDuck extends Duck{

    public TrueDuck() {
        flyBehavior=new FlyWithWings();
        quackBehavior=new Quack();
    }

    @Override
    public void display() {
        System.out.println("我是一隻真正的鴨子,,會飛,會叫!");
    }
}

編寫測試類

test.java
package chapter1;

/**
 * Created by fengyuwusong on 2017/7/29.
 */
public class test {
    public static void main(String[] args) {
//        新建一個模型鴨 這裏使用 Duck
        Duck model=new ModelDuck();
        model.display();
        model.performFly();
        model.performQuack();
//        新建一個真正的鴨子
        Duck trueDuck=new TrueDuck();
        trueDuck.display();
        trueDuck.performFly();
        trueDuck.performQuack();

        //動態改變模型鴨子的行爲,給他裝上翅膀
        model.setFlyBehavior(new FlyWithWings());
        model.performFly();
    }
}
運行結果

我是一隻模型鴨,不會飛,不會叫!
我不會飛!
我不會叫!
我是一隻真正的鴨子,,會飛,會叫!
我可以用翅膀飛!
呱呱叫!
我可以用翅膀飛!

文章參考Head First 設計模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章