首页 > 代码库 > 策略模式

策略模式

策略模式

一.设计原则:
    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     @Override4     public void fly() {5         System.out.println("不会飞的鸭子");6     }7 8 }
1 public class FlyWithWings implements FlyBehavior {2 3     @Override4     public void fly() {5         System.out.println("会飞的鸭子");6     }7 8 }
1 public class MuteQuack implements QuackBehavior {2 3     @Override4     public void quack() {5         System.out.println("发出的声音是-->>" + "MuteQuack");6     }7 8 }
1 public class Quack implements QuackBehavior {2 3     @Override4     public void quack() {5         System.out.println("发出的声音是-->>" + "Quack");6     }7 8 }
1 public class Squeak implements QuackBehavior {2 3     @Override4     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             @Override13             public void onClick(View v) {14                 Duck mallard = new MallaredDuck();15                 mallard.performFly();16                 mallard.performQuack();17             }18         });19     }20 21 }

输出的结果是:

 

 

 
 

策略模式