策略模式
策略模式
一.设计原则:
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 }
输出的结果是: