博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:3941 次
发布时间:2019-05-24

本文共 2221 字,大约阅读时间需要 7 分钟。

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

在这里插入图片描述

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

策略模式的Strategy 层为context 定义了一系列可重用的算法或行为,继承有助于析取出这些算法中的公共功能。
策略模式简化了单元测试,因为每一个算法都有自己的类,可以通过自己的接口单独测试
当不同的行为堆砌在一个类中的时候,就很难避免使用条件语句来选择合适的行为,将这些行为封装在一个个独立的Strategy 类中,可以在使用这些行为的类中消除条件语句。
策略模式是用来封装算法的,但在实际中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的事件应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

在这里插入图片描述

策略模式的主要优点如下。

  • 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
  • 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
  • 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
  • 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
  • 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

其主要缺点如下。

  • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
  • 策略模式造成很多的策略类。
    策略模式的结构与实现
    策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性,现在我们来分析其基本结构和实现方法。

策略模式的主要角色如下。

  1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

代码实现

#include 
using namespace std;class Strategy{
public: virtual double calculate(double &src) = 0;};//正常收费class Normal:public Strategy{
public: double calculate(double &src) {
return src; }};//折扣class Discount:public Strategy{
public: //必须输入一个折扣 Discount(double r):rebate(r){
} double calculate(double &src) {
return src * rebate; }private: double rebate;};//返现class Cashback:public Strategy{
public: Cashback(double &s,double &b):standsrd(s),back(b){
} double calculate(double &src) {
return src > standsrd ? (src-back):src; }private: double standsrd; double back;};class Context{
public: //传入一个原价和具体的策略 void setSrc(double &s) {
src = s; } void setStrategy(Strategy *st) {
strategy = st; } double contextCalculate() {
//调用具体的策略的计算方法 return strategy->calculate(src); }private: //存放一个具体的策略 Strategy *strategy; double src;};int main(){
Strategy *sd = new Discount(0.8); double src = 100; Context c; c.setSrc(src); c.setStrategy(sd); cout << c.contextCalculate() << endl; double standard = 500; double back = 200; src = 700; Strategy * sc= new Cashback(standard,back); c.setSrc(src); c.setStrategy(sc); cout << c.contextCalculate() << endl; return 0;}

参考文献:《大话设计模式》

转载地址:http://wanwi.baihongyu.com/

你可能感兴趣的文章
机器学习-训练模型的保存与恢复(sklearn)
查看>>
Spark(二): spark-submit命令详解
查看>>
细品 - 逻辑回归(LR)*
查看>>
hive: size与spilt连用
查看>>
Python:ModuleNotFoundError: No module named 模块名 错误及解决方案
查看>>
Python中os与sys两模块的区别
查看>>
nohup详解
查看>>
idea .gitignore对.idea不起作用解决
查看>>
深度学习中的注意力机制(2017版)-易理解
查看>>
Transformer解析-易理解
查看>>
多维数组[:,0]和[:0:1]获取的区别
查看>>
复原Ip地址
查看>>
重建二叉树
查看>>
二叉树根节点到叶子节点的路径数字之和
查看>>
根节点到叶子节点的节点值之和等于 sum的路径
查看>>
判断二叉树是否有从根节点到叶子节点的节点值之和等于sum的路径
查看>>
反转字符串
查看>>
环形链表
查看>>
删除链表的倒数第N个节点
查看>>
回文链表
查看>>