初探设计模式----策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设 定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为 算法的变化独立于算法的使用者。

我们用一个实例来看下什么策略模式的实现;

我们拿红头鸭和绿头鸭来举例,首先,他们都用共同的特性,比如它们都会游泳,然后,他们也有不同的特性,比如会飞与不会飞,鸭子的叫声也都不相同,那么我们该如何进行设计呢?

首先,我们来设置两个接口飞行的接口与叫声的接口:

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 }

 

posted @ 2017-09-08 09:44  崔布斯  阅读(317)  评论(0编辑  收藏  举报