首页 > 其他分享 >[设计模式]行为型模式-策略模式

[设计模式]行为型模式-策略模式

时间:2024-02-18 21:22:25浏览次数:21  
标签:策略 int 模式 strategy CalStrategy Operator operator 设计模式

前言

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变换不会影响使用算法的客户。

在项目开发中,我们经常要根据不同的场景,采取不同的措施,也就是不同的策略。假设我们需要对a、b这两个整数进行计算,根据条件的不同,需要执行不同的计算方式。我们可以把所有的操作都封装在同一个函数中,然后根据if ... else ...的形式来调用不同的计算方式,这种方式称为硬编码。

在实际应用中,随着功能和体验的不断增长,我们需要经常添加/修改策略,进而需要不断修改已有代码,这不仅会让这个函数越来越难以维护,还会因为修改带来一些Bug。因此,为了解耦,我们需要使用策略模式,定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法。

示例代码

策略模式的重点在于策略的设定,以及普通类Operator和策略CalStrategy的对接。通过更换实现同一接口的不同策略类。降低了Operator的维护成本,解耦算法实现。

Go

strategy.go

package strategy  
  
// CalStrategy 是一个策略类  
type CalStrategy interface {  
    do(int, int) int  
}  
  
// Add 为加法策略  
type Add struct{}  
  
func (*Add) do(a, b int) int {  
    return a + b  
}  
  
// Reduce 为减法策略  
type Reduce struct{}  
  
func (*Reduce) do(a, b int) int {  
    return a - b  
}  
  
// Operator 是具体的策略执行者  
type Operator struct {  
    strategy CalStrategy  
}  
  
// 设置策略  
func (o *Operator) setStrategy(strategy CalStrategy) {  
    o.strategy = strategy  
}  
  
// 调用策略中的方法  
func (o *Operator) calc(a, b int) int {  
    return o.strategy.do(a, b)  
}

单元测试

package strategy  
  
import "testing"  
  
func TestStrategy(t *testing.T) {  
    operator := Operator{}  
    operator.setStrategy(&Add{})  
    if operator.calc(1, 2) != 3 {  
       t.Fatal("Add strategy error")  
    }  
  
    operator.setStrategy(&Reduce{})  
    if operator.calc(2, 1) != 1 {  
       t.Fatal("Reduce strategy error")  
    }  
}

Python

from abc import ABC, abstractmethod


class CalStrategy(ABC):
    """策略类
    """
    @abstractmethod
    def do(self, a: int, b: int) -> int:
        pass


class Add(CalStrategy):
    """加法策略
    """
    def do(self, a: int, b: int) -> int:
        return a + b


class Reduce(CalStrategy):
    """减法策略
    """
    def do(self, a: int, b: int) -> int:
        return a - b


class Operator:
    """策略执行者
    """
    def __init__(self):
        self.strategy = None

    def set_strategy(self, strategy: CalStrategy):
        """设置策略
        """
        self.strategy = strategy

    def calc(self, a: int, b: int) -> int:
        """调用策略中的方法
        """
        return self.strategy.do(a, b)


if __name__ == "__main__":
    operator = Operator()
    operator.set_strategy(Add())
    print(operator.calc(1, 2))

    operator.set_strategy(Reduce())
    print(operator.calc(4, 3))

参考

  • 孔令飞 - 企业级Go项目开发实战

标签:策略,int,模式,strategy,CalStrategy,Operator,operator,设计模式
From: https://www.cnblogs.com/XY-Heruo/p/18019973

相关文章

  • Unity常用设计模式之代理模式
    代理模式是一种常用的设计模式,它允许一个对象代表另一个对象进行访问。在Unity中,代理模式经常被用来控制对某些对象的访问,以便在访问对象的同时进行一些额外的操作,比如权限控制、缓存、日志记录等。代理模式的结构包括三个角色:抽象主题(Subject)、真实主题(RealSubject)和代理(Proxy)。......
  • BOSHIDA DC电源模块的节能与环保设计策略
    BOSHIDADC电源模块的节能与环保设计策略DC电源模块的节能与环保设计策略可以从以下几个方面考虑: 1.高效率设计:设计高效率的电源转换器可以减少能量损耗,并最大限度地利用电能。使用高效率的功率开关器件、优化电路拓扑和控制算法,可以降低能量转换过程中的能量损失。2.低功......
  • 软件架构模式之第五章:事件驱动架构
     第五章:事件驱动架构近年来,事件驱动架构风格显著增长并广泛应用,我们对其理解方式也发生了改变。这种高采用率并不令人意外,因为事件驱动架构能够解决复杂的非确定性工作流和高度反应和响应的系统等难题。此外,新技术、工具、框架和基于云的服务使得事件驱动架构比以往更易访问......
  • stm32芯片的SPI接口调试总结之轮询模式
    一概念1组成SPI系统可直接与各个厂家生产的多种标准外围器件接口,它只需4条线:串行时钟线(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)和低电平有效的从机选择线(NSS)。(1)MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数......
  • 记一次centos7.9崩溃恢复操作(limits.conf配置失误),救援模式
    引起故障的原因:调整了操作系统的内核参数文件limits.conf,* softnproc131072* hardnproc131072* softnofile65536* hardnofile131072 以上的参数都扩大了10倍,ssh登录主机就开始异常了,连上去后就直接断开了,表象就是无法新建ssh会话连接,当前的用户有sudo免密操......
  • 策略模式实现短信平台切换
    如果你需要更通用的代码,以便在不同的短信平台之间进行切换,你可以使用策略模式来实现。策略模式允许你在运行时选择不同的策略(即短信平台),而无需改变主要的业务逻辑。首先,创建一个SmsPlatform接口,定义发送短信的方法:publicinterfaceSmsPlatform{voidsendSms(Stringphone......
  • 桥接模式
    桥接模式(Bridge模式)是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式的核心意图是将抽象和实现解耦,使得抽象部分和实现部分可以独立地进行扩展和变化,而不会互相影响。桥接模式包含两个主要角色:抽象化(Abstraction)角色和实现化(Implementor)角色......
  • 【数据结构】串的表示与模式匹配算法
    串串是内容受限的线性表(栈和队列是操作受限的线性表)串(string)是零个或多个任意字符组成的有限序列S:串名a1a2a3...an:串值n:串长当n=0时,表示空串,空串用\(\phi\)表示子串:一个串中任意个连续字符组成的子序列(含空串)例如“abc”的子串有“”、“a”、“b”、"c"、"ab"......
  • 软件架构模式之第四章:微内核架构
     第四章:微内核架构微内核架构风格是一种高度灵活且可扩展的架构,允许开发人员或最终用户以插件形式轻松地为现有应用程序添加额外功能和特性,而不会对系统的核心功能产生任何影响。因此,微内核架构常被称为“插件化架构”(这也是其另一个常见名称)。该架构风格非常适合产品型应用......
  • 在k8S中,所支持的存储供应模式有哪些?
    在Kubernetes(k8S)中,支持多种存储供应模式以满足不同场景下的持久化存储需求。主要的存储供应模式包括:静态供应(ManualProvisioning)在这种模式下,集群管理员手动创建PersistentVolume(PV)资源,并配置其具体的存储类型、大小和访问模式。然后用户通过创建与之匹配的Persi......