策略模式

定义

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

策略模式主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。除此之外,对于复杂代码来说,策略模式还能让其满足开闭原则,添加新策略的时候,最小化、集中化代码改动,减少引入bug的风险。

优点

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性良好。

缺点

1、策略类会增多。

2、所有策略类都需要对外暴露。

使用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

代码实现

比如我们在做支付的项目中,对于支付的类型,我们可能会有多种类型,我们可能要做微信支付,支付宝支付,苹果内购等等一些列的产品。。。

所以我们可以把每种支付产品定义成一种策略,然后根据不同的业务场景选择不同的支付产品

package main

import (
"fmt"
) func main() {
payment := NewPayment(&Weixin{
&PaymentConf{
appId: "wx1323234343434",
notifyURL: "weixin.notifyURL.com",
},
})
payment.Pay("小明", 12)
fmt.Println()
apay := NewPayment(&Ali{
&PaymentConf{
appId: "al1323234343434",
notifyURL: "ali.notifyURL.com",
},
})
apay.Pay("小红", 16)
} type Context struct {
strategy PaymentStrategy
} type PaymentConf struct {
appId string
notifyURL string
} func NewPayment(strategy PaymentStrategy) *Context {
return &Context{
strategy: strategy,
}
} func (p *Context) Pay(account string, money int) {
p.strategy.Pay(account, money)
} type PaymentStrategy interface {
Pay(account string, money int)
} type Weixin struct {
*PaymentConf
} func (w *Weixin) Pay(account string, money int) {
fmt.Printf("Pay %d元 to %s by weixin", money, account)
} type Ali struct {
*PaymentConf
} func (a *Ali) Pay(account string, money int) {
fmt.Printf("Pay %d元 to %s by ali", money, account)
}

来看下结构图

策略模式和工厂模式的区别

工厂模式

1、目的是创建不同且相关的对象

2、侧重于"创建对象"

3、实现方式上可以通过父类或者接口

4、一般创建对象应该是现实世界中某种事物的映射,有它自己的属性与方法

策略模式

1、目的实现方便地替换不同的算法类

2、侧重于算法(行为)实现

3、实现主要通过接口

4、创建对象对行为的抽象而非对对象的抽象,很可能没有属于自己的属性

参考

【策略模式实现代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/策略模式

【大话设计模式】https://book.douban.com/subject/2334288/

【极客时间】设计模式之美

【工厂模式】https://www.cnblogs.com/ricklz/p/15399178.html

【策略模式】https://boilingfrog.github.io/2021/10/26/使用go实现策略模式/

策略模式学习,使用go实现策略模式的更多相关文章

  1. php-cli模式学习(PHP命令行模式)(转)

    之前知道php—cli模式是一种类似shell命令式的执行php程序,不过一直以为这个是一种落后的方式,应该没有什么意义,因为从没有遇到过使用这个cli模式编程的.不过今天遇到了使用cli模式的应用. ...

  2. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

  3. C#设计模式学习笔记:(19)策略模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8057654.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第七个模式--策 ...

  4. 利用组策略禁用Oultook 各个版本的缓存模式!

    由于缓存模式有些自己特性和企业内的管理策略原因,有些用户不希望使用缓存模式来使用Outlook.我们怎么才能禁用缓存模式呢?请参考如下做法: 首先我们从网站上下载Office 相应的管理adm软件,这 ...

  5. 行为类模式(九):策略(Strategy)

    定义 针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. UML 优点 策略模式提供了管理相关的算法族的办法.策 ...

  6. 10、Strategy 策略模式 整体地替换算法 行为型模式

    1.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 2.举例 排序算法的问题,假如我们的程序中需要对数 ...

  7. EF Code-First 学习之旅 继承策略

    Code First中有三种不同的方法表示继承层次关系 1.Table per Hierarchy (TPH): 这种方法建议用一个表来表示整个类的继承层次关系,表中包含一个识别列来区分继承类,在En ...

  8. MVC模式学习笔记

    一.如何设计一个程序的结构,这是一门专门的学问,叫做“架构模式”(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,我觉得它不仅适用于开发软件,也适用于其 ...

  9. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

  10. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

随机推荐

  1. Asp.net MVC 跨域设置

    .Net Core 跨域 <system.webServer> <httpProtocol> <customHeaders> <add name=" ...

  2. MP4 视频“只闻其声,不见其人”,是怎么回事呢?

    艾瑞巴蒂大家好,我二狗子又来啦!这段时间关于疫情的好消息不断,各个地区的疫情都得到了有效的控制,做到了新增病例个位数增长甚至连续多天零增长!这不,二狗子也终于可以出村回到大城市上班啦!由于要坐很久的火 ...

  3. ME21N 采购订单屏幕增强

    1.业务需求 采购订单行项目新增"图号"和"价格类型"字段.其中图号只查询底表展示,不做修改:价格类型做下拉框: 2.增强实现 增强标准表EKPO结构CI_EK ...

  4. three.js 视频融合

    MixVideo.js代码: //视频融合 import * as THREE from '../build/three.module.js'; import { API } from '../js. ...

  5. AtCoder Beginner Contest 194 Editorial

    A - I Scream 根据 奶脂率 和 乳脂率 判断是何种冰淇淋 int main() { ios_base::sync_with_stdio(false), cin.tie(0); int a, ...

  6. Tomcat 优雅关闭之路

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/ZqkmoAR4JEYr0x0Suoq7QQ作者:马运杰 本文通过阅读Tomcat启动和关闭流程 ...

  7. Https 原理与工作流程及证书链校验

    本文为博主原创,未经允许不得转载: 目录 HTTP传输三大风险 安全通信原则 HTTPS定义 TLS/SSL 协议及加密算法 HTTPS工作流程 HTTPS协议和HTTP协议的区别 CA机构 证书链校 ...

  8. idea 配置 service 服务,多模块同时启动

    转载请注明出处: 1,打开IDEA项目 .idea 下 的workspace.xml 2,查找"RunDashboard" 节点 3,添加如下内容 <option name= ...

  9. 神经网络优化篇:详解学习率衰减(Learning rate decay)

    学习率衰减 加快学习算法的一个办法就是随时间慢慢减少学习率,将之称为学习率衰减,来看看如何做到,首先通过一个例子看看,为什么要计算学习率衰减. 假设要使用mini-batch梯度下降法,mini-ba ...

  10. 基于java+springboot的酒店预定网站、酒店客房管理系统

    该系统是基于Java的酒店客房预订系统设计与实现.是给师弟开发的毕业设计.现将源代码开放出来,感兴趣的同学可以下载. 演示地址 前台地址: http://hotel.gitapp.cn 后台地址: h ...