您的位置:首页 > 其它

策略模式

2016-04-11 20:41 357 查看
策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

设计原则:
1、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程;
3、多用组合,少用继承。

举例:
两种表现行为,即要实现两个算法族,封装为两个接口,分别是QuackBehavior和FlyBehavior接口: 

package com.nwpulisz.strategypattren;
public interface QuackBehavior {
public void quack();
}


package com.nwpulisz.strategypattren;
public interface FlyBehavior {
public void fly();
}


通过封装具体的类分别实现两个接口,即实现具体的算法:
继承QuackBehavior接口的类有如下两个(可以理解为两种实现Quack的算法,一个算法族):

package com.nwpulisz.strategypattren;
public class Quack implements QuackBehavior {
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
}


package com.nwpulisz.strategypattren;
public class MuteQuack implements QuackBehavior {
public void quack() {
// TODO Auto-generated method stub
System.out.println("Mute Quck");
}
}


继承FlyBehavior接口的类有如下两个,两中实现Fly的算法:

package com.nwpulisz.strategypattren;
public class FlyNoWay implements FlyBehavior {
public void fly() {
// TODO Auto-generated method stub
System.out.println("fly no way");
}
}


package com.nwpulisz.strategypattren;
public class FlyWithWings implements FlyBehavior {
public void fly() {
// TODO Auto-generated method stub
System.out.println("fly with wings");
}
}


定义Duck抽象类:

package com.nwpulisz.strategypattren;
public abstract class Duck {
FlyBehavior flyBehavior;    //为行为接口类型声明两个引用变量,所有鸭子的子类都会继承它们;
QuackBehavior quackBehavior;
public Duck(){

}
public abstract void display();

public void performFly(){
flyBehavior.fly();   //行为的执行委托给行为类;
}
public void performQuack(){
quackBehavior.quack();
}

public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}

}


定义一个Duck类的子类MallardDuck:

package com.nwpulisz.strategypattren;
public class MallardDuck extends Duck {
public MallardDuck(){
quackBehavior=new Quack();  //构造器中指定行为类;
flyBehavior= new FlyWithWings();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("Mallar Duck");
}
}


建立一个测试类:

package com.nwpulisz.strategypattren;
public class DuckSimulator {

public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallardDuck();
mallard.performQuack();   //构造器中指定行为类,output:Quack;
mallard.performFly();  //构造器中指定行为类,output:fly with wings;

mallard.setFlyBehavior(new FlyNoWay());    //调用set方法,可以动态改变行为;
mallard.setQuackBehavior(new MuteQuack());  //调用set方法,可以动态改变行为;
mallard.performQuack(); //output:Mute Quck;
mallard.performFly();  //output:fly no way;
}
}


来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: