Strategy 模式也叫策略模式,是由 GoF 提出的 23 种软件设计模式的一种。 Strategy 模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。 Strategy 模式主要用来平滑地处理算法的切换。
概要: - Strategy 模式定义一个算法族,并把每一种可能的算法封装成一个类,这些算法可以在应用程序内部被动态替换。策略模式可以降低客户端与算法之间的耦合关系。 - 这些算法具有一个相同的抽象接口,具体的算法通过继承的子类实现。 一个应用程序需要动态切换算法的时候, Strategy 模式便变得非常有用。 Strategy 模式的应用场景一般是: - 具有多种可能需要实现的算法 - 需要在程序中对算法进行动态切换 Strategy 模式 UML 类图
Strategy 策略(算法)抽象。 ConcreteStrategy 各种策略(算法)的具体实现。 Context 策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。
Strategy 模式的应用范例
为了帮助理解,我们举例来说明。 我们的程序要实现加密功能。加密有一个加密算法,加密算法有很多种,比如 MD5 , DES 等,我们的程序需要实现这个功能,就是可以让用户选择不同的加密算法进行加密。 这个过程我们可以用 Strategy 模式来实现。 文件一览: Client 测试类。 EncryptStrategy 相当于 Strategy 角色。加密算法的抽象类 / 接口。 DesStrategy 相当于 ConcreteStrategy 角色。 Des 加密算法。 MD5Strategy 相当于 ConcreteStrategy 角色。 MD5 加密算法。 EncryptContext 相当于 Context 角色。 代码:
package zieckey . designpatterns . study . strategy ; /** * * 客户端测试程序。 * @author zieckey * */ public class Client { public static void main ( String [] argv ) { //2 种不同的策略 // 使用DES 策略(算法) EncryptContext context = new EncryptContext ( new DesStrategy ()); context . encrypt (); // 使用MD5 策略(算法) context = new EncryptContext ( new MD5Strategy ()); context . encrypt (); } } package zieckey . designpatterns . study . strategy ; /** * * Context * * 给客户端调用的 * * @author zieckey * @since 2008/06/21 */ public class EncryptContext { IEncryptStrategy strategy ; public EncryptContext ( IEncryptStrategy strategy ) { this . strategy = strategy ; } // 执行具体的策略行为 public void encrypt () { strategy . encrypt (); } } package zieckey . designpatterns . study . strategy ; /** * * 加密算法接口。 * 所有的加密算法都必须实现该接口。 * 如果新增一个加密算法,那么只需要实现该接口,而现有的程序代码都不用改变。 * * @author zieckey * @since 2008/06/21 */ public interface IEncryptStrategy { public void encrypt (); // 加密算法 } package zieckey . designpatterns . study . strategy ; /** * 具体的加密算法 * @author zieckey * */ public class MD5Strategy implements IEncryptStrategy { public void encrypt () { System . out . println ( "encrypt by MD5 algorithm." ); //TODO MD5 algorithm HERE 。这里我们没给出具体的算法。 } } package zieckey . designpatterns . study . strategy ; /** * 具体的加密算法 * @author zieckey * */ public class DesStrategy implements IEncryptStrategy { public void encrypt () { System . out . println ( "encrypt by DES algorithm." ); //TODO DES algorithm HERE 。这里我们没给出具体的算法。 } }
测试输出:
encrypt by DES algorithm . encrypt by MD5 algorithm .
推荐网站:好巴鹿(http:// www.haobalu.com )