1. 策略模式解决的是什么问题

策略模式解决的应用场景是这样的: 在业务场景中,需要用到多个算法,并且每个算法的参数是需要调整的。那么当不同的行为堆砌到同一个类中时,我们很难避免使用条件语句来选择合适的行为。我们需要解决的是把算法封装起来,达到算法的变化不会影响到使用算法的客户的效果。实际上就是把算法模块给完全独立出来,并且易于配置、修改和扩展,实现“开闭”原则。

通俗来讲就是针对一个问题而定义出一个解决的模板,这个模板就是具体的策略,每个策略都是按照这个模板来的。这种情况下我们有新的策略时就可以直接按照模板来写,而不会影响之前已经定义好的策略。只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

2. 什么是策略模式

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

策略模式的Strategy类层次为Context定义了一系列可供重用的算法或者行为。继承有助于提取出这些算法中的公共功能。

策略模式的另一个优点:简化了单元测试。每个算法都有自己的类,是可以做自己的接口单独测试。

策略模式指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化

3. 策略模式的具体实现

#!/usr/bin/python3
# -*- coding: utf-8 -*- class CashStrategy(object):
def __init__(self):
pass def charge(self):
pass class CashNormal(CashStrategy):
def charge(self,money):
return money class CashRebate(CashStrategy):
def __init__(self, rebate):
self.rebaterate = rebate def charge(self, money):
return money * self.rebaterate class CashReturn(CashStrategy):
def __init__(self, return_standard, return_money):
self.return_standard = return_standard
self.return_money = return_money def charge(self, money):
if money >= self.return_standard:
return money - self.return_money
else:
return money class CashContext(object):
def __init__(self, charge_type, *charge_parameters):
self.charge_type = charge_type
if charge_type == 'Normal':
self.current_strategy = CashNormal()
if charge_type == 'Rebate':
self.current_strategy = CashRebate(charge_parameters[0])
if charge_type == 'Return':
self.current_strategy = CashReturn(charge_parameters[0],charge_parameters[1]) def charge_money(self,money):
#print(self.charge_parameters)
return self.current_strategy.charge(money) if __name__ == "__main__":
charge_cash_1 = CashContext('Rebate',0.8)
print('Rebate: ',charge_cash_1.charge_money(200))
charge_cash_2 = CashContext('Normal')
print('Normal: ',charge_cash_2.charge_money(200))
charge_cash_3 = CashContext('Return',200,100)
print('Return: ',charge_cash_3.charge_money(200))

Rebate: 160.0
Normal: 200
Return: 100

 

4. 策略模式与工厂模式的异同

相同点:

实际上,我们发现策略模式和工厂模式是很像的。本质实现上都是子类覆盖父类,利用了语言的继承特性

工厂模式中,每个要实现的,可以对应到策略模式中每个具体的Strategy

而工厂模式中的Factory,又可以对应到策略模式中的Context类。因为都在里面进行了对不同情况的处理(判断要实现哪个类,判断要采取哪种策略)

不同点:

用途不一样
工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;

关注点不一样
一个关注对象创建
一个关注行为的封装

简单工厂模式只是解决了对象的创建问题,工厂需要包括所有的产品对象的创建,如果产品对象形式经常变化,就需要经常改动工厂,以致代码重新编译。所以策略模式就诞生了,策略模式---它定义了算法家族,分别封装起来,而不是像简单产品模式一样定义所有的产品类让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户,使客户拥有相同的访问过程。

所以我认为除了概念上的侧重点不同(用途,关注点),两者最明显的差异就是:策略模式中,不同的模式之间可以相互替换,不会影响到使用算法的客户。而工厂模式中,各个类不能相互替换。

参考链接:

1. 《大话设计模式》

2.  工厂模式与策略模式之区别 https://blog.csdn.net/gaibian0823/article/details/27842443

设计模式之策略模式的Python实现的更多相关文章

  1. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

  2. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  3. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  4. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  5. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  6. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  7. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  8. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  9. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

随机推荐

  1. 1、React-Native的基础入门

    React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安 ...

  2. HashMap的使用

    HashMap的使用 import java.util.HashMap; import java.util.Iterator; //HashMap<key, value>():键值对的形式 ...

  3. NuGet管理和还原程序包

    在很多开源的程序下载下来不能使用,一般都是平台X86 和X64没有修改,还一个就是程序缺少资源包文件.用Nuget还原即可: 一般建议先修改好平台,然后用NuGet还原程序包.

  4. Angular环境配置

    1.安装node.js 访问官方网站:https://nodejs.org/en/下载node.js,直接下一步安装即可.安装完成打开cmd命令窗口输入node -v出现node版本号安装成功. 2. ...

  5. 多线程之ReadWriteLock模拟缓存(九)

    错误案例1: package com.net.thread.lock; import java.util.HashMap; import java.util.Map; import java.util ...

  6. POJ:3276-Face The Right Way(线性反转)

    Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6259 Accepted: 2898 De ...

  7. python 函数function

    函数 当代码出现有规律的重复的时候,只写一次函数实现多次使用(调用) 可使用的函数: 自定义函数 内置函数:文档  https://docs.python.org/3/library/function ...

  8. 关于我的Android 博客

    我是曹新雨,我为自己代言.现在的菜鸟,3年以后我就是大神.为自己加油.微信:aycaoxinyu 关于我的Android博客,都是我当初遇到困难,克服之后,写上去的.后来,有人加我微信,问我一些问题, ...

  9. android onNewIntent 为什么要在onNewIntent的时候要显示的去调用setIntent

    原因: 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getInte ...

  10. 腾讯云分析MTA HTML5接入方法

    从微信服务号或订阅号里跳转到自己项目后,想在项目中统计出实时数据.历史趋势.实时访客.新老访客比.访客画像.地域信息.运营商.终端信息.页面排行.性能监控.访问深度.外部链接.入口页面.离开页面.渠道 ...