Strategy--定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
参与者
Strategy- -- 定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
ConcreteStrategy(具体策略)- -- 以Strategy接口实现英雄模范具体算法。
Context(上下文)- --用一个ConcreteStrategy对象来配置。
- --可定义一个接口来让Strategy访问它的数据。
适用性- 当存在以下情况时使用Strategy模式
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。
- 算法使用了客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
考虑您要设计一个更换各种符号的工具类TextCharChange,您是否会采用这样的方式:
public void replace() {
switch(getChangeType()) {
case RN_TYPE: replaceRN();
break;
case N_TYPE: replaceN();
break;
case OTHER_TYPE: replaceOTHER():
break;
...
}
}
这么作的缺点是,日后您要增加更换符号的策略时,会有几个地方需要修改:增加TYPE常数、增加TextCharChange中的 replaceXXX()方法、增加 replace()方法中的switch case判断。
像这种策略采用的情况,可以将策略加以封装为一个物件,而不是将策略写死在某个类中,如此一来,策略可以独立于客户端,随时增加变化、增加或减少策略,即使是修改每个策略的内容,也不会对客户端程式造成影响。
来举个最简单的例子,首先要知道Windows与Linux的文字档案换行符号是不同的,Windows是 /r/n ,而Linux是 /n,今天您要设计一个文字编辑器,在适当的时候,您必须要能随时转换这两种符号,如果不采用上面的策略采用流程的话,要如何设计:
public abstract class TextStrategy {
protected String text;
public TextStrategy(String text) {
this.text = text;
}
public abstract String replace();
}
public class LinuxStrategy extends TextStrategy {
public LinuxStrategy(String text) {
super(text);
}
public String replace() {
preOperation();
System.out.println(
text = text.replaceAll("@r@n", "@n"));
postOperation();
return text;
}
private void preOperation() {
System.out.println("LinuxStrategy preOperation");
}
private void postOperation() {
System.out.println("LinuxStrategy postOperation");
}
}
public class WindowsStrategy extends TextStrategy {
public WindowsStrategy(String text) {
super(text);
}
public String replace() {
startOperation();
System.out.println(
text = text.replaceAll("@n", "@r@n"));
endOperation();
return text;
}
private void startOperation() {
System.out.println("WindowsStrategy startOperation");
}
private void endOperation() {
System.out.println("WindowsStrategy endOperation");
}
}
public class TextCharChange {
public static void replace(TextStrategy strategy) {
strategy.replace();
}
}
public class Main {
public static void main(String[] args) {
String linuxText =
"This is a test text!!@n Oh! Line Return!!@n";
String windowsText =
"This is a test text!!@r@n Oh! Line Return@r@n";
// load file, suppose it's Linux's text file
// take the WindowsStrategy
// I want to change it to Windows' text file
TextCharChange.replace(
new WindowsStrategy(linuxText));
// such-and-such operation.....
System.out.println();
// load file, suppose it's Windows' text file
// take the LinuxStrategy
// I want to change it to Linux's text file
TextCharChange.replace(
new LinuxStrategy(windowsText));
}
}
为了明显的秀出结果,我们使用@n来表示 '/n' , @r 表示 '/r' 符号,Main中的流程是个假设的情况,何时采用何种策略是随机的。
在Strategy模式中,使用一个公开的介面replace(),让客户端请求,而在实作replace()时,可以任意的组合演算策略,程式中的 preOperation()、postOperation()就是用以示意演算的组合概念,Strategy模式封装了这些演算过程,使它们易于组合、修改、替换,上面这个例子的UML 类别结构图如下所示:
Strategy模式的UML类别结构图如下:
从行为上来说,State 模式 与Strategy模式是蛮相近的。
State模式:看当前是什么状态,就采取什么动作。
Strategy模式:看需求(情境)是什么,采用适当的策略。
不过两者虽相似,应用的场合稍有不同,State模式中有一个重点在于设定状态变化,就像 Gof 例子中举的TCP连线;Strategy策略模式则是直接采用适当的策略的感觉,例如Gof中说的,采用适当的演算法来作正文换行。
分享到:
相关推荐
C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载
strategy策略模式源码 策略模式源码 策略模式源码 策略模式源码
C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式
主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用方法,需要的朋友可以参考下
主要介绍了Ruby设计模式编程中Strategy策略模式的使用实例,Strategy模式在Ruby on Rails框架开发中也经常用到,需要的朋友可以参考下
NULL 博文链接:https://wlh269.iteye.com/blog/360194
主要介绍了iOS应用开发中对设计模式中的Strategy策略模式的运用,例子采用传统的Objective-C语言代码演示,需要的朋友可以参考下
使用strategy策略模式完成算法的封装,实现三种排序算法之间的互相替换。
设计模式C++学习之策略模式(Strategy)
走进设计模式之 策略模式(Strategy) 代码
设计模式 策略模式。金典模式之策略模式代码。
【Java设计模式】(2)策略模式Strategy
这种设计模式比较常用,希望能够帮助到大家。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。...
一个把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出 <table><tr><td>Jack</td></tr><tr><td>Maya...
设计模式-策略模式(Strategy)结合Android小知识讲解,简单明了
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each ...
strategy(策略模式Java代码实现)