《大话设计模式》c++实现 之策略模式

一、UML图

 

二、概念

策略模式:他定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

 

三、优点

(1)策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

(2)策略模式的Strategy类曾是为Context定义了一些列的可供重用的算法或行为。集成有助于析取出这些算法中的公共功能。

(3)策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

(4)策略模式就是用来封装算法的。

(5)只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

(6)简单工厂模式需要让客户端认识两个类,而策略模式和简单工厂模式结合的用法,客户端只需要认识一个类Context即可。

四 与工厂模式的区别:

工厂模式用来选择分支,产生不同的产品,(类)

策略模式是针对算法的,不同的算法用不同的类

  1 #include <iostream>
  2 using namespace std;
  3
  4
  5
  6
  7 // 抽象产品类
  8 class Operation{
  9 protected:
 10     double num1;
 11     double num2;
 12 public:
 13     double get_n1(){
 14         return num1;
 15     }
 16     double get_n2(){
 17         return num2;
 18     }
 19     void set_n1(int num){
 20         num1 = num;
 21     }
 22     void set_n2(int num){
 23         num2 = num;
 24     }
 25     virtual double GetResult(){
 26         double result = 0;
 27         return result;
 28     }
 29
 30 };
 31 //具体产品类
 32 class OperationAdd :public Operation{
 33 public:
 34     double GetResult(){
 35         double result = 0;
 36         result = num1 + num2;
 37         return result;
 38     }
 39 };
 40
 41 //具体产品类
 42 class OperationSub :public Operation{
 43 public:
 44     double GetResult(){
 45         double result = 0;
 46         result = num1 - num2;
 47         return result;
 48     }
 49 };
 50
 51 //具体产品类
 52 class OperationMul :public Operation{
 53 public:
 54     double GetResult(){
 55         double result = 0;
 56         result = num1 * num2;
 57         return result;
 58     }
 59 };
 60
 61 //具体产品类
 62 class OperationDiv :public Operation{
 63 public:
 64     double GetResult(){
 65         double result = 0;
 66         if (num2 != 0)
 67             result = num1 / num2;
 68         return result;
 69     }
 70 };
 71 //工厂类
 72
 73 class OperationFactory{
 74 public:
 75     Operation* createOperation(char type){
 76         Operation* oper = NULL;
 77         switch (type)
 78         {
 79         case ‘+‘:
 80             oper = new OperationAdd;
 81             break;
 82         case ‘-‘:
 83             oper = new OperationSub;
 84             break;
 85         case ‘*‘:
 86             oper = new OperationMul;
 87             break;
 88         case ‘/‘:
 89             oper = new OperationDiv;
 90             break;
 91         }
 92         return oper;
 93     }
 94 };
 95
 96
 97 //策略类
 98 class Context{
 99 private:
100     Operation* op_;
101 public:
102     Context(char type){
103         OperationFactory of;
104         op_ = of.createOperation(type);
105     }
106     double executeOperation(double num1, double num2){
107         op_->set_n1(num1);
108         op_->set_n2(num2);
109         return op_->GetResult();
110     }
111
112 };
113
114 void main(){
115
116     double res = 0;
117     Context co = Context(‘+‘);
118     res = co.executeOperation(5, 3);
119     cout << res << endl;
120
121
122     Context co2 = Context(‘-‘);
123     res = co2.executeOperation(5, 3);
124     cout << res << endl;
125
126
127
128     system("pause");
129 }

参考:

http://www.runoob.com/design-pattern/strategy-pattern.html

https://blog.csdn.net/xiqingnian/article/details/41855391

原文地址:https://www.cnblogs.com/zle1992/p/9742300.html

时间: 2024-11-13 08:19:26

《大话设计模式》c++实现 之策略模式的相关文章

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

&amp;lt;二&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之策略模式

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

《大话设计模式》 --- 第二章 策略模式

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类. 策略模式:定义了算法,分别封装,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合. 策略模式中普通算法的策略类为环境定义了一系列可供重用的算法或行为.继承有助于析出出这些算法中的公共功能.

大话设计模式读书笔记--2.策略模式

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类 定义 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户 模式结构 Strategy: 定义所有支持算法的公共接口 ConcreteStrategy: 封装了具体的算法或行为,也就是具体的策略 Context:是算法对象工厂, 维护一个Strategy对象的引用, 产生具体算法对象 模式实现 场景:模拟商城收银软件,营业员根据客户所

Java设计模式(七)策略模式 模板模式

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

C#设计模式之十九策略模式(Stragety Pattern)【行为型】

原文:C#设计模式之十九策略模式(Stragety Pattern)[行为型] 一.引言 今天我们开始讲"行为型"设计模式的第七个模式,该模式是[策略模式],英文名称是:Stragety Pattern.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员,比如:有的是普通员工,有的是软件架构师,有的是部门经理,当然也会有公司的CEO.这些工作人员负责的工作不同,担负的责任不同,自然得到的报酬也就不同了.每种工作人员都有自己的工资,但是每个工种的工作人员的工资的

大话设计模式1.0.2-----策略模式 单一职责原则 和 开放-封闭原则

大话设计模式第二章之:策略模式 算法之间可以互相调用 策略模式就是用来封装算法的. 大话设计模式第三章之:单一职责原则 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因 类承担的职责不能过多,因为有时,完成一个职责,会影响到其他职责的, 手机只用来接电话,相机只用来拍照,功能才强大,集成太多了,其他功能就弱化了. 对应一些问题,要方法化,要类分离化 大话设计模式第四章之:开放-封闭原则 开放-封闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改.OCP 扩展是开放的,修

设计模式(一)策略模式

1.什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法簇,并且之间可以互相替换,此模式算法的变化独立于使用算法的客户. 2.策略模式有什么好处? 策略模式的好处在于你可以动态改变对象的行为. 3.设计原则 设计原则是把一个类中经常改变或者将来改变的部分提取出来,作为一个接口(C++中可以用抽象类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现这个接口的类的行为. 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口(C++中即为抽象基