設計原則:
1. 找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起
2. 針對介面編程,而不是針對試下編程
3. 多用組合,少用繼承
策略模式:
定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。
Duck問題:
public abstract class Duck {QuackBehavior quackBehavior;FlyBehavior flyBehavior;//more...public Duck() {}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("All ducks float,even decoys!");}public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}}
public interface FlyBehavior {public void fly();}
public interface QuackBehavior {public void quack();}
public class FlyWitheWings implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("I am flying!!");}}
public class FlyNoWay implements FlyBehavior {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("I cannot fly...");}}
public class FlyRocketPowered implements FlyBehavior {@Overridepublic void fly() {System.out.println("I am flying with a rocket!");}}
public class Quack implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("Quack");}}
public class MuteQuack implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("<<Silence>>");}}
public class Squeek implements QuackBehavior {@Overridepublic void quack() {// TODO Auto-generated method stubSystem.out.println("Squeak");}}
public class MallardDuck extends Duck{public MallardDuck(){quackBehavior = new Quack();flyBehavior = new FlyWitheWings();}@Overridepublic void display() {// TODO Auto-generated method stub}}
public class ModelDuck extends Duck {public ModelDuck() {flyBehavior = new FlyNoWay();quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("I am a model duck");}}
//測試類別
public class MiniDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performQuack();mallard.performFly();Duck model = new ModelDuck();model.performFly();model.setFlyBehavior(new FlyRocketPowered());model.performFly();}}
輸出:
Quack
I am flying!!
I cannot fly...
I am flying with a rocket!