Strategy模式
来源:互联网 发布:软件成熟度等级 编辑:程序博客网 时间:2024/05/20 00:39
Strategy模式
Strategy模式要解决的问题和Template模式相似,都是为了把算法的声明和算法的实现解耦.Template模式是通过继承来实现的,而Strategy模式是通过组合来实现的.
Strategy模式将算法封装到一个类(Context)里面,通过组合的方式将算法在组合的对象中实现,之后通过委托将抽象接口委托给组合对象来实现.其类结构图如下
实现:
//Strategy.h
//Strategy.hclass Strategy{public: virtual void PrimitiveOperation() = 0; virtual ~Strategy();protected: Strategy();};class ConcreteStrategy1 :public Strategy{public: ConcreteStrategy1(); ~ConcreteStrategy1(); void PrimitiveOperation();};class ConcreteStrategy2 :public Strategy{public: ConcreteStrategy2(); ~ConcreteStrategy2(); void PrimitiveOperation();};
//Strategy.cpp
//Strategy.cpp#include"Strategy.h"#include<iostream>using namespace::std;Strategy::Strategy(){}Strategy::~Strategy(){}ConcreteStrategy1::ConcreteStrategy1(){}ConcreteStrategy1::~ConcreteStrategy1(){}void ConcreteStrategy1::PrimitiveOperation(){ cout << "ConcreteStrategy1 PrimitiveOperation()" << endl;}ConcreteStrategy2::ConcreteStrategy2(){}ConcreteStrategy2::~ConcreteStrategy2(){}void ConcreteStrategy2::PrimitiveOperation(){ cout << "ConcreteStrategy2 PrimitiveOperation()" << endl;}
//Context.h
//Context.h#ifndef _CONTEXT_H_#define _CONTEXT_H_class Strategy;class Context{public: Context(Strategy*); ~Context(); void DoAction();private: Strategy* _strategy;};#endif
//Context.cpp
//Context.cpp#include"Context.h"#include"Strategy.h"Context::Context(Strategy* strategy){ _strategy = strategy;}Context::~Context(){ delete _strategy;}void Context::DoAction(){ _strategy->PrimitiveOperation();}
//main.cpp
//main.cpp#include"Context.h"#include"Strategy.h"int main(){ Strategy* p1 = new ConcreteStrategy1(); Strategy* p2 = new ConcreteStrategy2(); Context* c1 = new Context(p1); Context* c2 = new Context(p2); c1->DoAction(); c2->DoAction(); return 0;}
可以看出Template是通过继承来实现接口,而Strategy模式是通过组合来实现.这两种方式各有优缺点.
继承:优点是易于扩展和修改那些被复用的实现.
缺点有:1)破坏了封装,继承父类的实现细节暴露给子类了.2)"白盒"复用,因为1).3)父类实现更改时,所有子类不得不随之改变.4)从父类继承而来的实现在运行期间不能被改变(编译期间已经确定了).
组合:优点:1)"黑盒"复用,封装性好.2)实现和抽象的依赖性低,因为组合对象和被组合对象之间的依赖性很小.3)可以在运行期间修改,例如通过更改指针指向的对象.
缺点就是系统对象过多.
0 0
- strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- STRATEGY 模式
- Strategy 模式
- Strategy模式
- strategy模式
- Strategy模式
- Strategy 模式
- Strategy 模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Android实现文字一个一个显示出来
- 什么是 web 语义化?有什么好处?
- 小程序UI与传统HTML5区别
- [JAVA]java.text.NumerFormat的使用问题
- codeforces 804B——Ice cream coloring(图论,dfs,数据结构,好题)
- Strategy模式
- vue中实现图片丶文件上传
- Cypher查询语言--Neo4j中的SQL
- Fragment页面布局不让软键盘把页面顶上去的解决办法
- 【CC2640】CC2640软件开发从入门到专家的注意点
- iOS程序生命周期,苹果内购、微信支付、支付宝支付
- 2017年ACM模板(常用)弱渣整理 二、二分
- 在网站建设中一般都需要些什么功能?
- CF