策略模式

策略模式

 

一.设计原则:
    1)找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
    2) 针对接口编程,而不是针对实现编程(例如:鸭子例子当中,fly()和quack()对不同的鸭子是会变的,所以分别定义两个接口FlayBehavior和QuackBehavior中分别饱饭两个方法,但鸭子类不直接继承这两个包含鸭子行为的接口,而是去继承对这两个接口做具体实现的类,在利用该类的时候用到多态就实现了针对接口编程的)
    3)多用组合,少用继承
二.下面直接贴出策略模式代码:
   
 
定义行为接口:
  FlyBehavior:
1 public interface FlyBehavior {
2     public void fly();
3 }

  QuackBehavior:

1 public interface QuackBehavior {
2     
3     public void quack();
4     
5 }

对接口的实现:

1 public class FlyWithNoWings implements FlyBehavior {
2 
3     @Override
4     public void fly() {
5         System.out.println("不会飞的鸭子");
6     }
7 
8 }
1 public class FlyWithWings implements FlyBehavior {
2 
3     @Override
4     public void fly() {
5         System.out.println("会飞的鸭子");
6     }
7 
8 }
1 public class MuteQuack implements QuackBehavior {
2 
3     @Override
4     public void quack() {
5         System.out.println("发出的声音是-->>" + "MuteQuack");
6     }
7 
8 }
1 public class Quack implements QuackBehavior {
2 
3     @Override
4     public void quack() {
5         System.out.println("发出的声音是-->>" + "Quack");
6     }
7 
8 }
1 public class Squeak implements QuackBehavior {
2 
3     @Override
4     public void quack() {
5         System.out.println("发出的声音是-->>" + "Sequck");
6     }
7 
8 }

鸭子抽象类定义:

 1 /**
 2  * 鸭子具有什么行为就组合什么相关实现类
 3  * 
 4  * @author liang
 5  * 
 6  */
 7 public abstract class Duck {
 8     public FlyBehavior mFlyBehavior;
 9     public QuackBehavior mQuackBehavior;
10     
11     public abstract void display();// 必须实现的一个方法
12     
13     // 委托给行为类
14     public void performFly(){
15         mFlyBehavior.fly();
16     }
17     
18     public void performQuack(){
19         
20         mQuackBehavior.quack();
21     }
22 
23 }

利用多态对具体鸭子实现:

 1 public class MallaredDuck extends Duck {
 2 
 3     public MallaredDuck() {
 4         mFlyBehavior = new FlyWithWings();
 5         mQuackBehavior = new Squeak();
 6     }
 7 
 8     @Override
 9     public void display() {
10         System.out.println("展示一只鸭子");
11     }
12 
13 }

测试:

 1 public class MainActivity extends Activity {
 2 
 3     private Button btn;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         btn = (Button) findViewById(R.id.btn);
10         btn.setOnClickListener(new OnClickListener() {
11 
12             @Override
13             public void onClick(View v) {
14                 Duck mallard = new MallaredDuck();
15                 mallard.performFly();
16                 mallard.performQuack();
17             }
18         });
19     }
20 
21 }

输出的结果是:

 源码下载

 

 
 
posted @ 2014-10-14 11:23  perfect亮  阅读(203)  评论(0编辑  收藏  举报