策略模式
来源:互联网 发布:数据分析软件有哪些 编辑:程序博客网 时间:2024/05/16 07:34
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式里涉及到以下几个角色:
1.Context类,表示应用场景,包含一个策略类的基类指针
2.Strategy类,抽象类,定义了策略类的接口
3.ConcreteStrategy,具体策略类,一般有多个,实现了Strategy定义的接口
策略模式的UML图:
策略模式中每个算法都被封装成了类,可以通过自己的接口单独测试,简化了单元测试,同时避免了程序中过多的条件转移语句,简化了系统并使整个系统易于扩展,遵守了高内聚低耦合的设计原则。但同时,为每一个策略都产生一个类的做法增加了系统中类的个数,并且客户端必须了解这些算法的区别,算法类的选择由客户端负责。
C++实现:
namespace StrategyPattern{class Strategy//定义算法类接口{public:virtual ~Strategy(){}virtual void algorithmInterface() = 0;};class Context//算法类的应用场景{public:Context(){}Context(Strategy *pStrategy) :mPStrategy(pStrategy){}void setStrategy(Strategy* pStrategy){mPStrategy = pStrategy;}void ContextInterface(){mPStrategy->algorithmInterface();}private:Strategy *mPStrategy;};class ConcreteStrategy1 :public Strategy//具体策略类1{public:~ConcreteStrategy1(){}void algorithmInterface(){cout << "using ConcreteStrategy1" << endl;}};class ConcreteStrategy2 :public Strategy//具体策略类2{~ConcreteStrategy2(){}void algorithmInterface(){cout << "using ConcreteStrategy2" << endl;}};class ConcreteStrategy3 :public Strategy//具体策略类3{~ConcreteStrategy3(){}void algorithmInterface(){cout << "using ConcreteStrategy3" << endl;}};void test(){Context ctt1;Strategy *s1 = new ConcreteStrategy1();Strategy *s2 = new ConcreteStrategy2();Strategy *s3 = new ConcreteStrategy3();ctt1.setStrategy(s1);ctt1.ContextInterface();ctt1.setStrategy(s2);ctt1.ContextInterface();ctt1.setStrategy(s3);ctt1.ContextInterface();delete s1;delete s2;delete s3;}}
java代码:
public class Context {static void process(Strategy sttg ){sttg.algorithmsInterface();}public static void main(String[] args) {// TODO Auto-generated method stubprocess(new ConcreteStrategy1());process(new ConcreteStrategy2());}}interface Strategy{void algorithmsInterface();}class ConcreteStrategy1 implements Strategy{public void algorithmsInterface(){System.out.println("ConcreteStrategy1");}}class ConcreteStrategy2 implements Strategy{public void algorithmsInterface(){System.out.println("ConcreteStrategy2");}}
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- Python笔记1--关于序列的学习
- 耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒。
- 浅尝CKRule规则引擎
- 大牛blog汇总
- 2-1000内的所有完数
- 策略模式
- WAS7升级后遗症
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- Effective Java (7) 避免使用终结方法
- 图像分割—基于图的图像分割(OpenCV源码注解)
- 261页binaryMaxIndexSmallerThanValue
- 多重背包转换成完全背包和01背包
- HOJ 12822 The Alphabet Sticker
- bzoj1690 [Usaco2007 Dec]奶牛的旅行