前言
本文为datawhale2022年12月组队学习《大话设计模式》task2打卡学习,内容主要以官方所提供为主,会加入一些个人的学习心得。
【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern
一、策略模式
1.1 基本定义
策略模式(Strategy Pattern)
是指定义一个算法家族,使得家族内的不同算法都遵从算法家族的接口及方法规范,从而可以实现算法间互相替换,且不会影响到使用算法的客户。
简单来说,就是提前准备好一组算法,将每一个算法的实现封装起来,在使用时进行互换。
1.2 问题引入
实现一个商场收银软件程序,营业员可以通过输入客户所有购买商品的单价和数量,程序自动计算出总金额。同时,商场有时会有打折活动(如商品打7折),或满减促销活动(如商品满300-100),程序应能考虑这些活动的情形,在尽量减少重复代码的前提下,实现正确的金额计算。
1.2.1 问题分析
对于打7折,打8折,满300-100,满700-200等商场的促销活动,其整体的业务逻辑是类似的,而且随时可以相互替换,符合策略模式的应用场景。
1.2.2 问题解决
- 首先创建抽象的算法类
CashSupur
,作为所有促销活动算法的抽象类,同时定义所有支持算法的公共接口,定义方法acceptCash()
用于得到结果; - 创建具体的促销算法类
CashNormal
,CashRebate
等,继承于抽象算法类CashSupur
,覆写acceptCash()
实现具体的促销算法; - 创建上下文类
CashContext
,维护对算法对象的引用,使用时根据用户输入,传入一个具体的促销算法类来配置。
1.2.3 代码实现
这里不再多余进行复制粘贴了,直接放上datawhale所给的的源码链接:
策略模式Java实现
策略模式python实现
1.3 与简单工厂模式的区别
其实单看代码,直观给人感觉高度相似,没有什么区别,但是如果深入分析一下,其实还是有许多不同。
- 首先看这两种模式的实现类:
简单工厂模式 :
# 简单工厂方法实现
class CashFactory(object):
def create_cash_accept(self,typ):
cs = CashSuper()
if typ == "正常收费":
cs = CashNormal()