策略模式:策略模式定義了算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。
需求: 設計一些可以動態改變的鴨子。
設計一些行爲類
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 設計模式