策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程;
3、多用组合,少用继承。
举例:
两种表现行为,即要实现两个算法族,封装为两个接口,分别是QuackBehavior和FlyBehavior接口:
1 package com.nwpulisz.strategypattren; 2 public interface QuackBehavior { 3 public void quack(); 4 }
1 package com.nwpulisz.strategypattren; 2 public interface FlyBehavior { 3 public void fly(); 4 }
通过封装具体的类分别实现两个接口,即实现具体的算法:
继承QuackBehavior接口的类有如下两个(可以理解为两种实现Quack的算法,一个算法族):
1 package com.nwpulisz.strategypattren; 2 public class Quack implements QuackBehavior { 3 public void quack() { 4 // TODO Auto-generated method stub 5 System.out.println("Quack"); 6 } 7 }
1 package com.nwpulisz.strategypattren; 2 public class MuteQuack implements QuackBehavior { 3 public void quack() { 4 // TODO Auto-generated method stub 5 System.out.println("Mute Quck"); 6 } 7 }
继承FlyBehavior接口的类有如下两个,两中实现Fly的算法:
1 package com.nwpulisz.strategypattren; 2 public class FlyNoWay implements FlyBehavior { 3 public void fly() { 4 // TODO Auto-generated method stub 5 System.out.println("fly no way"); 6 } 7 }
1 package com.nwpulisz.strategypattren; 2 public class FlyWithWings implements FlyBehavior { 3 public void fly() { 4 // TODO Auto-generated method stub 5 System.out.println("fly with wings"); 6 } 7 }
定义Duck抽象类:
1 package com.nwpulisz.strategypattren; 2 public abstract class Duck { 3 FlyBehavior flyBehavior; //为行为接口类型声明两个引用变量,所有鸭子的子类都会继承它们; 4 QuackBehavior quackBehavior; 5 public Duck(){ 6 7 } 8 public abstract void display(); 9 10 public void performFly(){ 11 flyBehavior.fly(); //行为的执行委托给行为类; 12 } 13 public void performQuack(){ 14 quackBehavior.quack(); 15 } 16 17 public void setFlyBehavior(FlyBehavior flyBehavior) { 18 this.flyBehavior = flyBehavior; 19 } 20 public void setQuackBehavior(QuackBehavior quackBehavior) { 21 this.quackBehavior = quackBehavior; 22 } 23 24 }
定义一个Duck类的子类MallardDuck:
1 package com.nwpulisz.strategypattren; 2 public class MallardDuck extends Duck { 3 public MallardDuck(){ 4 quackBehavior=new Quack(); //构造器中指定行为类; 5 flyBehavior= new FlyWithWings(); 6 } 7 @Override 8 public void display() { 9 // TODO Auto-generated method stub 10 System.out.println("Mallar Duck"); 11 } 12 }
建立一个测试类:
1 package com.nwpulisz.strategypattren; 2 public class DuckSimulator { 3 4 public static void main(String[] args) { 5 // TODO Auto-generated method stub 6 Duck mallard = new MallardDuck(); 7 mallard.performQuack(); //构造器中指定行为类,output:Quack; 8 mallard.performFly(); //构造器中指定行为类,output:fly with wings; 9 10 mallard.setFlyBehavior(new FlyNoWay()); //调用set方法,可以动态改变行为; 11 mallard.setQuackBehavior(new MuteQuack()); //调用set方法,可以动态改变行为; 12 mallard.performQuack(); //output:Mute Quck; 13 mallard.performFly(); //output:fly no way; 14 } 15 }