3.2 Strategy (策略模式)
动机:在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用或不常使用的算法也是一个性能负担。
如何在运行时根据需要透明地改变对象的算法?将算法和对象本身解耦,从而避免上述问题?
代码示例:
如果使用第一种方法,需要更改枚举类型和if else语句(第6行和24行),违背了开放封闭原则(对扩展开发,对修改封闭);
采用第二种方法(策略模式),定义税法基类,对不同国家税法定义不同子类,override Calculate方法。59行,多态调用。
假设出现变化:扩展32 - 39行,SalesOrder不变(复用性,遵循开放封闭原则)。
补:面向对象提到的复用性,指的是编译单位(二进制单位)的复用性,不是粘贴代码的复用性
// strategy1.cpp
enum TaxBase {
CN_Tax,
US_Tax,
DE_Tax,
FR_Tax //更改
}; class SalesOrder{
TaxBase tax;
public:
double CalculateTax(){
//... if (tax == CN_Tax){
//CN***********
}
else if (tax == US_Tax){
//US***********
}
else if (tax == DE_Tax){
//DE***********
}
else if (tax == FR_Tax){ //更改
//...
} //....
}
//Strategy.cpp
class TaxStrategy{
public:
virtual double Calculate(const Context& context)=;
virtual ~TaxStrategy(){}
}; class CNTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
}; class USTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
}; class DETax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
}; //扩展
//*********************************
class FRTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//.........
}
}; class SalesOrder{
private:
TaxStrategy* strategy; public:
SalesOrder(StrategyFactory* strategyFactory){
this->strategy = strategyFactory->NewStrategy();
}
~SalesOrder(){
delete this->strategy;
} public double CalculateTax(){
//...
Context context(); double val =
strategy->Calculate(context); //多态调用
//...
} };
定义: 定义一系列算法, 把它们一个个封装起来,并且使它们可以互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
类图:
要点总结:
Strategy及其子类为组件提供了一系列可重用的算法,从而可以得到类型在运行时方便地根据需要在各个算法之间进行切换。
Strtegy模式提供了用条件判断语句以外的另一种选择消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。(除非if else语句绝对不变,如对一周七天判断等)
如果Strategy对象没有实例变量,那么各个上下午可以共享同一个Strategy对象,从而节省对象开销。
c++ 设计模式4 (Strategy)的更多相关文章
-
设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
-
设计模式 策略-Strategy,装饰-Decorator,观察者-Observer
重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...
-
设计模式之Strategy(策略)(转)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲 ...
-
设计模式(21)--Strategy(策略模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...
-
设计模式之Strategy模式
策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具体的共同接口的独立类中,从而使得他们可以互相替换. 策略模式使得算法可以在不影响客户端的情况下发生变化. all in one “ ...
-
Design Pattern 设计模式1 - Strategy 1
实现 : Defferent Heros attack Defferently. - 不同的英雄使用不用的招数 Strategy设计的思路: 基类A.更加小的基类B,新的继承类C: 1 从基类A中抽出 ...
-
go语言设计模式之Strategy
package main import ( "flag" "fmt" "image" "image/color" &qu ...
-
设计模式:strategy模式
思想:将算法进行抽象,然后使用桥接的模式使用算法的抽象接口,达到算法整体替换的目的 理解:和桥接模式相同,只是桥接的两边分开的思想不同 例子: class Algrithm //算法的抽象 { pub ...
-
《Head First设计模式(中文版)》
<Head First设计模式(中文版)>共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式.前言先介绍<Head First设计模式(中文版)>的 ...
-
《Head First 设计模式》【PDF】下载
<Head First 设计模式>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196307 First 设计模式>[PDF] ...
随机推荐
- css3多列样式
-
取消Git代理设置
昨天由于在用sourceTree上传下拉代码的时候,速度实在太慢,就照着百度上的方法设置了代理,结果导致sourceTree无法访问服务器,经检查排除发现可能是因为公司网络不能使用代理,被防火墙挡住了 ...
-
inventor应用程序错误---解决方法
---恢复内容开始--- 点击 出现类似 我使用了网上的几个方法,最后是下载了2014--SP1补丁安装后就能正常打开程序了 http://pan.baidu.com/s/1pLQxp2b 这是地址3 ...
-
Linux系统管道命令符
管道命令符“|”的作用是将前一个命令的标准输出作为后一个命令的标准输入,格式为“命令A | 命令B” 以下实例中,通过grep命令搜索关键字“/sbin/nologin”在/etc/passwd中查找 ...
-
使用plspl创建orcale作业
1.由于权限问题,第一步应先以sys账户登录,路径:工具->DBMS 调试程序->作业 ,新建一个作业,出现如下图的窗口 2.开始依次填写相应内容,Name为作业名字,注意要加上用户名前 ...
-
第52节:String,权限修饰符,方法,集合
String String str1 = "dashu"; String str2 = "dashu"; String string = new String( ...
-
转载,自己留着看eclipse 快捷键
Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...
-
POJ 1753 Flip Game (枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26492 Accepted: 11422 Descr ...
-
cps/trampoline
eopl 第五.六两章谈的就是这个问题. 我写了一个 python 版本的程序,先挖个坑,然后等彻底看完再补上. #!/usr/bin/env python # -*- coding: utf-8 - ...
-
RadioButton ---- 样式效果切换
\res\drawable\radio_button_bg.xml <?xml version="1.0" encoding="utf-8"?> & ...