策略模式-鸭子的变化

来源:互联网 发布:surge mac 下载 编辑:程序博客网 时间:2024/04/30 18:56

OO基础:抽象、封装、多态、继承

OO原则:封装变化、多用组合,少用继承、针对接口编程,不针对实现编程

策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

1、代码结构:


2、飞行package

[java] view plaincopy
  1. package duck.fly;  
  2.   
  3. /** 
  4.  * 鸭子飞行接口 
  5.  */  
  6. public interface FlyBehavior {  
  7.     public void fly();  
  8. }  

[java] view plaincopy
  1. package duck.fly;  
  2.   
  3. /** 
  4.  * 不能飞行的类 
  5.  */  
  6. public class FlyNoWay implements FlyBehavior{  
  7.   
  8.     @Override  
  9.     public void fly() {  
  10.         System.out.println("I can't fly");  
  11.     }  
  12.   
  13. }  

[java] view plaincopy
  1. package duck.fly;  
  2.   
  3. /** 
  4.  * 可以飞行的类 
  5.  */  
  6. public class FlyWithWings implements FlyBehavior{  
  7.   
  8.     @Override  
  9.     public void fly() {  
  10.         System.out.println("I'm flying!");  
  11.     }  
  12.       
  13. }  

[java] view plaincopy
  1. package duck.fly;  
  2.   
  3. /** 
  4.  * 使用火箭助推器进行飞行 
  5.  */  
  6. public class FlyRocketPowered implements FlyBehavior{  
  7.   
  8.     @Override  
  9.     public void fly() {  
  10.         System.out.println("I'm flying with a rocket");  
  11.     }  
  12.   
  13. }  

3、叫声package

[java] view plaincopy
  1. package duck.quack;  
  2.   
  3. /** 
  4.  * 叫的行为接口 
  5.  */  
  6. public interface QuackBehavior {  
  7.     public void quack();  
  8. }  

[java] view plaincopy
  1. package duck.quack;  
  2.   
  3. /** 
  4.  * 嘎嘎叫 
  5.  */  
  6. public class Quack implements QuackBehavior{  
  7.   
  8.     @Override  
  9.     public void quack() {  
  10.         System.out.println("Quack");  
  11.     }  
  12.   
  13. }  

[java] view plaincopy
  1. package duck.quack;  
  2.   
  3. /** 
  4.  * 什么都不做,不会叫 
  5.  */  
  6. public class MuteQuack implements QuackBehavior{  
  7.   
  8.     @Override  
  9.     public void quack() {  
  10.         System.out.println("<< Silence >>");  
  11.     }  
  12.   
  13. }  

[java] view plaincopy
  1. package duck.quack;  
  2.   
  3. /** 
  4.  * 呱呱叫 
  5.  */  
  6. public class Squeak implements QuackBehavior{  
  7.   
  8.     @Override  
  9.     public void quack() {  
  10.         System.out.println("Squeak");  
  11.     }  
  12.   
  13. }  

4、鸭子package

[java] view plaincopy
  1. package duck.duck;  
  2.   
  3. import duck.fly.FlyBehavior;  
  4. import duck.quack.QuackBehavior;  
  5.   
  6. /** 
  7.  * 鸭子的抽象类 
  8.  * 使用组合的方式有时候比使用继承的方式更加好 
  9.  */  
  10. public abstract class Duck {  
  11.     FlyBehavior flyBehavior;//飞行行为  
  12.     QuackBehavior quackBehavior;//叫的行为  
  13.       
  14.     /** 
  15.      * 鸭子的外貌 
  16.      */  
  17.     public abstract void display();  
  18.       
  19.     public void performFly(){  
  20.         flyBehavior.fly();  
  21.     }  
  22.       
  23.     public void performQuack(){  
  24.         quackBehavior.quack();  
  25.     }  
  26.       
  27.     public void swim(){  
  28.         System.out.println("All ducks float, even decoys");  
  29.     }  
  30.   
  31.     public void setFlyBehavior(FlyBehavior flyBehavior) {  
  32.         this.flyBehavior = flyBehavior;  
  33.     }  
  34.   
  35.     public void setQuackBehavior(QuackBehavior quackBehavior) {  
  36.         this.quackBehavior = quackBehavior;  
  37.     }  
  38. }  

[java] view plaincopy
  1. package duck.duck;  
  2.   
  3. import duck.fly.FlyWithWings;  
  4. import duck.quack.Quack;  
  5.   
  6. /** 
  7.  * 野鸭子 
  8.  */  
  9. public class MallardDuck extends Duck{  
  10.   
  11.     public MallardDuck(){  
  12.         quackBehavior = new Quack();  
  13.         flyBehavior = new FlyWithWings();  
  14.     }  
  15.       
  16.     @Override  
  17.     public void display() {  
  18.         System.out.println("I'm a real Mallard duck");  
  19.     }  
  20.   
  21. }  


[java] view plaincopy
  1. package duck.duck;  
  2.   
  3. import duck.fly.FlyNoWay;  
  4. import duck.quack.Quack;  
  5.   
  6. /** 
  7.  * 模型鸭 
  8.  */  
  9. public class ModelDuck extends Duck{  
  10.   
  11.     public ModelDuck(){  
  12.         quackBehavior = new Quack();  
  13.         flyBehavior = new FlyNoWay();  
  14.     }  
  15.       
  16.     @Override  
  17.     public void display() {  
  18.         System.out.println("I'm a model duck");  
  19.     }  
  20.   
  21. }  

5、测试类

[java] view plaincopy
  1. package duck;  
  2.   
  3. import duck.duck.Duck;  
  4. import duck.duck.MallardDuck;  
  5. import duck.duck.ModelDuck;  
  6. import duck.fly.FlyRocketPowered;  
  7.   
  8. /** 
  9.  * 测试类 
  10.  */  
  11. public class MiniDuckSimulator {  
  12.     public static void main(String[] args) {  
  13.         Duck mallard = new MallardDuck();  
  14.         mallard.performFly();  
  15.         mallard.performQuack();  
  16.         System.out.println("------------------");  
  17.         Duck model = new ModelDuck();  
  18.         model.performFly();  
  19.         //让不会飞的模型鸭子使用助推器  
  20.         model.setFlyBehavior(new FlyRocketPowered());  
  21.         model.performFly();  
  22.     }  
  23.     /** 
  24.      * 运行结果: 
  25.      *  I'm flying! 
  26.         Quack 
  27.         ------------------ 
  28.         I can't fly 
  29.         I'm flying with a rocket 
  30.      */  
原创粉丝点击