您的位置:首页 > 其它

设计模式之策略模式

2016-06-09 00:00 169 查看
策略模式:定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.此模式主要使用的设计原则是依赖倒置原则.

使用鸭子来举个列子,鸭子分为家鸭,野鸭,木头鸭。家鸭能叫不能飞,野鸭能叫又能飞,木头鸭不能叫也不能飞。 那么我们就可以把飞和叫定义为两个不同的算法族。

飞行算法族:

[code=language-java]/**
*飞行算法族
* @author zhuleqi
*/
public  interface FlyBehavior {
public void fly();
}

[code=language-java]/**
*使用翅膀飞行
* @author zhuleqi
*/
public class FlyWithWings implements FlyBehavior{

@Override
public void fly() {
System.err.println("fly with wing");
}

}

[code=language-java]/**
*不能飞行
* @author zhuleqi
*/
public class NoFly implements FlyBehavior{

@Override
public void fly() {
System.err.println("I can't fly");
}

}

叫算法族:

[code=language-java]/**
*叫算法族
* @author zhuleqi
*/
public interface QuackBehavior {
public void quack();
}

[code=language-java]
/**
*
* @author zhuleqi
*/
public class NormalQuack implements QuackBehavior{

@Override
public void quack() {
System.err.println("我是一只正常叫的鸭子");
}

}

[code=language-java]/**
*
* @author zhuleqi
*/
public class NoQuack implements QuackBehavior
{

@Override
public void quack() {
System.err.println("I can not quack");
}

}

这两个算法族都使用了依赖倒置的原则,这个原则的好处是:易于扩展。比如:某天突然需要增加一个安装了火箭喷射器的唐老鸭,我们就只需要在实现这两个算法接口,而不用破坏程序结构。

算法族的使用者鸭子:

[code=language-java]
/**
* 算法族的客户
* @author zhuleqi
*/
public  class Duck {
/**
* 鸭子的飞行行为
*/
private FlyBehavior flyBehavior;
/**
* 鸭子的叫
*/
private QuackBehavior quackBehavior;

public void display() {
System.err.println(" 我是鸭子");
}

public void swim() {
System.err.println(" 我可以在水里游");
}

public void fly() {
if(this.getFlyBehavior() == null){
return;
}
this.getFlyBehavior().fly();
}

public void quack() {
if(this.getQuackBehavior() == null){
return ;
}
this.getQuackBehavior().quack();
}

/**
* @return the flyBehavior
*/
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}

/**
* @param flyBehavior the flyBehavior to set
*/
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}

/**
* @return the quackBehavior
*/
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}

/**
* @param quackBehavior the quackBehavior to set
*/
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}

}

执行一下:

[code=language-java]/**
*  策略模式定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.主要使用的设计原则是依赖倒置原则.
*
* @author zhuleqi
*/
public class Strategy {

public static void main(String[] args) {
Duck duck = new Duck();
duck.setFlyBehavior(new FlyWithWings());
duck.setQuackBehavior(new NormalQuack());
print(duck);
}

private static void print(Duck duck) {
duck.display();
duck.fly();
duck.quack();
}
}

源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: