策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设 定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为 算法的变化独立于算法的使用者。
我们用一个实例来看下什么策略模式的实现;
我们拿红头鸭和绿头鸭来举例,首先,他们都用共同的特性,比如它们都会游泳,然后,他们也有不同的特性,比如会飞与不会飞,鸭子的叫声也都不相同,那么我们该如何进行设计呢?
首先,我们来设置两个接口飞行的接口与叫声的接口:
1 public interface FlyBehavior { 2 void fly(); 3 }
1 public interface QuackBehavior { 2 void quack(); 3 };
在这里,飞行里面有飞行方法,叫声里面有叫声方法,后面我们会实现具体的方法:
会飞与不会飞:
1 public class GoodFlyBehavior implements FlyBehavior 2 { 3 @Override 4 public void fly() { 5 // TODO Auto-generated method stub 6 System.out.println("--GoodFly--"); 7 } 8 }
1 public class BadFlyBehavior implements FlyBehavior 2 { 3 @Override 4 public void fly() { 5 // TODO Auto-generated method stub 6 System.out.println("--BadFly--"); 7 } 8 }
1 public class NoFlyBehavior implements FlyBehavior 2 { 3 @Override 4 public void fly() { 5 // TODO Auto-generated method stub 6 System.out.println("--NoFly--"); 7 } 8 }
然后是不同的叫声:
1 public class GaGaQuackBehavior implements QuackBehavior 2 { 3 @Override 4 public void quack() { 5 // TODO Auto-generated method stub 6 System.out.println("__GaGa__"); 7 } 8 }
1 public class GeGeQuackBehavior implements QuackBehavior 2 { 3 @Override 4 public void quack() { 5 // TODO Auto-generated method stub 6 System.out.println("__GeGe__"); 7 } 8 }
1 public class NoQuackBehavior implements QuackBehavior 2 { 3 @Override 4 public void quack() { 5 // TODO Auto-generated method stub 6 System.out.println("__NoQuack__"); 7 } 8 }
接下来各种行为都有了,我们来设计一个超类,把共同的特性进行提取,所有的鸭子将会继承这个超类:
1 public abstract class Duck { 2 3 FlyBehavior mFlyBehavior; 4 QuackBehavior mQuackBehavior; 5 6 public Duck() {} 7 8 public void Fly() { 9 mFlyBehavior.fly(); 10 } 11 12 public void Quack() { 13 mQuackBehavior.quack(); 14 } 15 16 public abstract void display(); 17 18 public void SetQuackBehavoir(QuackBehavior qb) { 19 mQuackBehavior = qb; 20 } 21 22 public void SetFlyBehavoir(FlyBehavior fb) { 23 mFlyBehavior = fb; 24 } 25 26 public void swim() { 27 System.out.println("~~im swim~~"); 28 } 29 }
上面的Duck超类我们定义了两个方法分别是飞行方式和叫声,然后我们可以通过set方法对其进行设置,然后共同的游泳我们直接写在了超类里,因为所有鸭子都会游泳
然后我们该写具体的红头鸭和绿头鸭的类了:
1 public class GreenHeadDuck extends Duck { 2 3 public GreenHeadDuck() { 4 mFlyBehavior = new GoodFlyBehavior(); 5 mQuackBehavior = new GaGaQuackBehavior(); 6 } 7 8 @Override 9 public void display() { 10 // TODO Auto-generated method stub 11 System.out.println("**GreenHead**"); 12 } 13 14 }
1 public class RedHeadDuck extends Duck { 2 3 public RedHeadDuck() { 4 mFlyBehavior = new BadFlyBehavior(); 5 mQuackBehavior = new GeGeQuackBehavior(); 6 } 7 8 @Override 9 public void display() { 10 // TODO Auto-generated method stub 11 System.out.println("**RedHead**"); 12 } 13 14 }
绿头鸭飞的很好并且它gaga叫,红头鸭飞得不好并且它gege叫;
最后,我们来测试一下:
1 public class StimulateDuck { 2 3 public static void main(String[] args) { 4 5 Duck mGreenHeadDuck = new GreenHeadDuck(); 6 Duck mRedHeadDuck = new RedHeadDuck(); 7 8 mGreenHeadDuck.display(); 9 mGreenHeadDuck.Fly(); 10 mGreenHeadDuck.Quack(); 11 mGreenHeadDuck.swim(); 12 13 mRedHeadDuck.display(); 14 mRedHeadDuck.Fly(); 15 mRedHeadDuck.Quack(); 16 mRedHeadDuck.swim(); 17 mRedHeadDuck.display(); 18 mRedHeadDuck.SetFlyBehavoir(new NoFlyBehavior()); 19 mRedHeadDuck.Fly(); 20 mRedHeadDuck.SetQuackBehavoir(new NoQuackBehavior()); 21 mRedHeadDuck.Quack(); 22 } 23 24 }