策略模式

  hyc   hyc     2022-08-21     495

关键词:

它定义了一系列的算法,并将每个算法封装起来,而且使他们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。

优点:

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

  2)避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。

  3)遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。

缺点:

  1)因为每个具体策略类都会产生一个新类,所以会增加系统需要维护类的数量。

  2)在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

进一步优化可以将策略模式与简单工厂模式相结合,选择所用具体实现的职责也可以由Context对象承担,这就最大化的减轻了客户端的职责。

结合策略模式与简单工厂模式实现的简单收银系统代码:

Strategy.h:

  1 #include<iostream>
  2 #include<string>
  3 #include<memory>
  4 using namespace std;
  5 
  6 //strategy抽象类,用作接口
  7 class Strategy
  8 {
  9 public:
 10     virtual double GetResult(double money) = 0;
 11     virtual ~Strategy()
 12     {
 13         cout<<" in the destructor of Strategy"<<endl;
 14     }
 15 };
 16 //正常结算方式
 17 class CashNormal : public Strategy
 18 {
 19     double GetResult(double money)
 20     {
 21         return money;
 22     }
 23     ~CashNormal()
 24     {
 25         cout<<" in the destructor of CashNormal"<<endl;
 26     }
 27 };    
 28 //打折
 29 class CashRebate : public Strategy
 30 {
 31 private:
 32     double moneyRebate;  //折扣率
 33 public:
 34     //构造函数
 35     CashRebate(double rebate)
 36     {
 37         moneyRebate = rebate;
 38     }
 39 
 40     double GetRebate()
 41     {
 42         return moneyRebate;
 43     }
 44     void SetRebate(double rebate)
 45     {
 46         moneyRebate = rebate;
 47     }
 48 
 49     double GetResult(double money)
 50     {
 51         return money * moneyRebate;
 52     }
 53 };
 54 //返现
 55 class CashReturn : public Strategy
 56 {
 57     //返现的条件与方式
 58 private:
 59     double moneyCondition;
 60     double moneyReturn;
 61 public:
 62     //构造函数
 63     CashReturn(double condition, double re)
 64     {
 65         moneyCondition = condition;
 66         moneyReturn = re;
 67     }
 68 
 69     double GetCondition()
 70     {
 71         return moneyCondition;
 72     }
 73     void SetCondition(double condition)
 74     {
 75         moneyCondition = condition;
 76     }
 77     double GetReturn()
 78     {
 79         return moneyReturn;
 80     }
 81     void SetReturn(double re)
 82     {
 83         moneyReturn = re; 
 84     }
 85 
 86     double GetResult(double money)
 87     {
 88         if(money >= moneyCondition)
 89         {
 90             money = money - (int)(money / moneyCondition) * moneyReturn;
 91         }
 92         return money;
 93     }
 94 };
 95 
 96 //现金收费工厂类
 97 class CashFactory
 98 {
 99 public:
100     static Strategy* createGetResult(int type)
101     {
102         Strategy* cs;
103         switch(type)
104         {
105         case 0:
106             cs = new CashNormal();
107             break;
108         case 1:
109             cs = new CashRebate(0.8);
110             break;
111         case 2:
112             cs = new CashReturn(300,100);
113             break;
114         default:
115             break;
116         }
117         return cs;
118     }
119 };
120 
121 //CashContext类   策略模式与简单工厂模式相结合
122 class CashContext
123 {
124 private:
125     Strategy* cs;
126 public:
127     CashContext(int type)
128     {
129         bool loop = true;
130         while(loop){
131         switch (type)
132         {
133         case 0:
134             cs =new CashNormal();
135             loop = false;
136             break;
137         case 1:
138             cs = new CashRebate(0.8);
139             loop = false;
140             break;
141         case 2:
142             cs = new CashReturn(300,100);
143             loop = false;
144             break;
145         default:
146             cout<<"输入有误! 请重新输入!"<<endl;
147             cin>>type;
148             break;
149         }
150         }
151     }
152 
153     double GetResult(double money)
154     {
155         return cs->GetResult(money);
156     }
157 };

Strategy.cpp:

 1 #include "Strategy.h"
 2 void main(int argc, char *argv)
 3 {
 4     int type = 0;
 5     double total = 0;
 6     cout<<"选择收费方式:"<<endl
 7         <<"0:正常方式"<<endl
 8         <<"1:打折方式"<<endl
 9         <<"2:返现方式"<<endl;
10     cin >> type;
11     /*
12     CashFactory cfactory;
13     Strategy *pay = cfactory.createGetResult(type);
14     cout<<"输入总的消费金额:";
15     cin >> total;
16     cout<<"应收金额为:"<<pay->GetResult(total)<<endl;
17     */
18     CashContext cs(type);
19     cout<<"输入总的消费金额:";
20     cin >> total;
21     cout<<"应收金额为:"<<cs.GetResult(total)<<endl;
22 }

 

java设计模式---策略模式(案例解析)

策略模式一、概念1、理解策略模式策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一... 查看详情

策略模式

1策略模式实际上就是应对有各种策略(实现方法)的需求。比如超市促销,有多种多样的促销策略,这时候就要想到策略模式,策略模式一般会配合工厂模式使用。代码如下:packagecom.biao.strategy.original;/****@authorbiao*策略模式:... 查看详情

代码片-策略模式+工厂模式(代码片段)

通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情

代码片-策略模式+工厂模式(代码片段)

通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情

代码片-策略模式+工厂模式(代码片段)

通过策略类实现不同场景的策略处理,通过工厂模式创建不同的策略对象1.策略实现接口、策略实现类1.1策略接口/***策略接口*/publicinterfaceIWarnRulepublicvoidwarn();1.2策略实现类/***防拆告警策略实现类*/publicclassAntiRemovalWarnimplements... 查看详情

设计模式之策略模式

策略模式属于对象行为型的设计模式定义:封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端  策略模式有以下3个角色组成抽象策略类:所有策略类的父类,为所支持的... 查看详情

设计模式-策略模式

策略模式(strategypattern)策略模式(strategypattern):策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的... 查看详情

设计模式——策略模式

策略模式的重点并不是策略的实现,而是策略的管理的使用!应用场景:当同一种职责,有不同的实现方式的时候可以使用策略管理;角色:1、策略抽象类  2、策略的具体实现   3、策略环境(此类的作用在代... 查看详情

《设计模式之禅》之策略模式

一、策略模式的定义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使用的是面向对象的继承和多态机制,我们看看策略模式的三个... 查看详情

设计模式中的多态——策略模式详解(代码片段)

目录1.关于策略模式2.策略模式详解2.1策略模式定义2.2策略模式的UML类图3.策略模式的优点3.1一个使用策略模式的例子3.2与其他实现方式的对比3.3使用策略模式的优点4.使用工厂方法模式改进原有策略模式5.总结5.参考资料1.关于策... 查看详情

策略模式与工厂模式实践(代码片段)

hello,大家好,我是聪聪。文章目录1.介绍2.策略模式结构2.1分支逻辑解释2.2策略模式设计2.3策略模式代码2.3.1通用策略接口及其各策略实现。2.3.2执行上下文信息2.3.3客户端调用2.3.4总结3.常用示例3.1定义一个策略枚举3.2策... 查看详情

策略模式与工厂模式实践(代码片段)

hello,大家好,我是聪聪。文章目录1.介绍2.策略模式结构2.1分支逻辑解释2.2策略模式设计2.3策略模式代码2.3.1通用策略接口及其各策略实现。2.3.2执行上下文信息2.3.3客户端调用2.3.4总结3.常用示例3.1定义一个策略枚举3.2策... 查看详情

策略模式与工厂模式实践(代码片段)

hello,大家好,我是聪聪。文章目录1.介绍2.策略模式结构2.1分支逻辑解释2.2策略模式设计2.3策略模式代码2.3.1通用策略接口及其各策略实现。2.3.2执行上下文信息2.3.3客户端调用2.3.4总结3.常用示例3.1定义一个策略枚举3.2策... 查看详情

策略模式

策略模式策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使它们可以相互替换。策略模式是对算法的包装,是把算法使用和算法本身分开。策略模式通常是把一系列算法包装到一系列的策略... 查看详情

设计模式笔记-策略模式(代码片段)

设计模式笔记-策略模式文章目录设计模式笔记-策略模式1.策略模式2.常见写法3.常见框架中的策略模式1.策略模式策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换,在使... 查看详情

策略模式

...在于他们的行为的不同一个系统需要动态地在几种算法(策略)中选择一种 三、优点1、开闭原则2、避免使用多种条件转移语句if..else3、提高算法的保密性和安全性 四、缺点1、客户端必须知道所有的策略类,并自行决定... 查看详情

策略模式

琢磨了一下策略模式,发现各个模式之间并非区别特别大,他们都是基于软件project一个大的基础上进行细微化区别的设计。要想熟练的选择和使用各个模式要了解每一个模式的应用场景。比方这次学习的策略模式。在大话设计... 查看详情

设计模式笔记-策略模式(代码片段)

设计模式笔记-策略模式文章目录设计模式笔记-策略模式1.策略模式2.常见写法3.常见框架中的策略模式1.策略模式策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换,在使... 查看详情