策略模式

定义

策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到客户端的使用,也称为政策模式(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. ME31K 创建框架协议

    1业务说明 在实际业务需求中,需要和供应商签订协议. 此文档使用BAPI:BAPI_CONTRACT_CREATE创建协议 2前台实现 事务代码:ME31K 输入抬头信息 行项目 行项目详细内容 保存 ...

  2. 路径规划之 A* 算法

    算法介绍 A*(念做:A Star)算法是一种很常用的路径查找和图形遍历算法.它有较好的性能和准确度.本文在讲解算法的同时也会提供Python语言的代码实现,并会借助matplotlib库动态的展示算 ...

  3. 负载均衡--rpc服务端

    1. dubbo负载均衡的作用? 其出发点,自然也就是普通的负载均衡器的出发点了. 将负载均衡功能实现在rpc客户端侧,以便能够随时适应外部的环境变化,更好地发挥硬件作用. 而且客户端的负载均衡天然地 ...

  4. <vue 路由 1、路由的基本使用>

    一.     项目创建 参考如下博客地址创建一个vue的项目 https://www.cnblogs.com/yclh/p/15356171.html   vue学习笔记 二.环境搭建+项目创建 二. ...

  5. vue如何实现v-model

  6. 简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet

    前言 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测.图像分割.物体跟踪.行为分析.人脸识别等其他高层次视觉任务的基础.图像分类在许多领域都有着广泛的应用,如:安防 ...

  7. shell脚本(16)-awk命令

    文档目录 一.awk介绍 二.awk基本用法 1.awk对字段(列)的提取: 2.awk对记录(行)的提取: 3.awk对字符串提取: 4.awk程序的优先级: 三.awk高级用法 1.awk定义数组 ...

  8. go 接口学习笔记

    这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...

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

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

  10. NewStarCTF 2023 公开赛道 WEEK5|CRYPTO WP

    last_signin from Crypto.Util.number import * flag = b'?' e = 65537 p, q = getPrime(1024), getPrime(1 ...