设计模式系列19:策略模式(Stragety Pattern)
程序员文章站
2023-02-21 08:22:57
定义定义一系列算法,将它们一个个封装起来,并且使它们可以互相替换,该模式使得算法可独立于使用它的客户而变化。 --《设计模式》GoFUML类图使用场景一个系统有许多类,而区分它们的只是他们直接的行为时。在有多种算法相似的情况下,使用if…else…所带来的复杂和难以维护。关键组成部分1,抽象策略角色... ......
定义
定义一系列算法,将它们一个个封装起来,并且使它们可以互相替换,该模式使得算法可独立于使用它的客户而变化。 --《设计模式》gof
uml类图
使用场景
- 一个系统有许多类,而区分它们的只是他们直接的行为时。
- 在有多种算法相似的情况下,使用if…else…所带来的复杂和难以维护。
关键组成部分
1,抽象策略角色(strategy):定义公共接口,context上下文使用这个接口调用不同的算法,一般使用接口实现(也可以使用抽象类)。
2,具体策略角色(concretestrategy):接口的实现,实现具体的算法。
3,上下文角色(context):维护一个策略对象的引用,并用定义允许策略访问其数据的接口。
c#代码实现
using system; namespace dofactory.gangoffour.strategy.structural { /// <summary> /// mainapp startup class for structural /// strategy design pattern. /// </summary> class mainapp { /// <summary> /// entry point into console application. /// </summary> static void main() { context context; // three contexts following different strategies context = new context(new concretestrategya()); context.contextinterface(); context = new context(new concretestrategyb()); context.contextinterface(); // wait for user console.readkey(); } } /// <summary> /// the 'strategy' abstract class /// </summary> abstract class strategy { public abstract void algorithminterface(); } /// <summary> /// a 'concretestrategy' class /// </summary> class concretestrategya : strategy { public override void algorithminterface() { console.writeline( "called concretestrategya.algorithminterface()"); } } /// <summary> /// a 'concretestrategy' class /// </summary> class concretestrategyb : strategy { public override void algorithminterface() { console.writeline( "called concretestrategyb.algorithminterface()"); } } /// <summary> /// the 'context' class /// </summary> class context { private strategy _strategy; // constructor public context(strategy strategy) { this._strategy = strategy; } public void contextinterface() { _strategy.algorithminterface(); } } }
运行结果: