您的位置:首页 > 其它

设计模式:策略模式(Strategy)

2016-04-25 20:19 316 查看
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。



策略模式的角色:

1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现

2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为

3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用

这里引用参考资料3中的例子来详细说明一下策略模式。

“赔了夫人又折兵”——这个是《三国演义》里的著名桥段,主要是说刘备要去吴国娶孙权妹妹了,走之前诸葛亮给了赵云三个锦囊:“你保主公入吴,可一次按这三个锦囊内之计行事。”第一计:初入东吴,告知全城刘备娶孙尚香,并拜访乔国老,让吴国太施压不让刺杀刘备;第二计:刘备沉迷酒色,乐而忘返之计,骗说:“今早接孔明来报,曹操起精兵五十万,杀奔荆州而来!军情十分紧急,请主公马上回荆州!”;第三计:逃跑之时,孙夫人断后。

1 抽象策略角色

public interface Strategy
{
public void operate();
}


2 具体策略角色

class ConcreteStrategyA implements Strategy
{
@Override
public void operate()
{
System.out.println("初入东吴....#####");
}
}

class ConcreteStrategyB implements Strategy
{
@Override
public void operate()
{
System.out.println("乐而不返....#####");
}
}

class ConcreteStrategyC implements Strategy
{
@Override
public void operate()
{
System.out.println("腹背受敌....#####");
}
}


3 环境角色Context

public class Context
{
private Strategy strategy;

public Context(Strategy strategy)
{
this.strategy = strategy;
}

public void doOperate()
{
this.strategy.operate();
}
}


4 测试代码

Context context = null;
context = new Context(new ConcreteStrategyA());
context.doOperate();
context = new Context(new ConcreteStrategyB());
context.doOperate();
context = new Context(new ConcreteStrategyC());
context.doOperate();


输出结果:

初入东吴....#####
乐而不返....#####
腹背受敌....#####


策略模式和工厂模式的区别

工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;而策略模式是行为型的,它接受已经创建好的实例,实现不同的行为。


Jdk中的策略模式:

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()



参考资料

1. 《23种设计模式

2. 《细数JDK里的设计模式

3. 《java设计模式之——策略模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: