首页 > 其他分享 >设计模式-策略模式

设计模式-策略模式

时间:2024-08-27 21:54:09浏览次数:6  
标签:策略 可以 模式 算法 file 设计模式 string

1. 概念定义

        策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,从而让算法的变化不会影响到使用算法的客户。策略模式使得算法可以在不影响客户端的情况下发生变化。

        在策略模式中,我们将不同的算法封装在独立的类中,称为策略类。每一个策略类实现一个共同的接口,这样可以在运行时通过该接口来调用具体的算法

策略模式的主要角色有:

  1. 策略接口(Strategy):这是一个接口,定义了算法的公共方法。

  2. 具体策略类(Concrete Strategy):实现策略接口的具体类,每个类封装了一种算法。

  3. 上下文类(Context):持有一个策略接口的引用,它可以动态地更换策略。

 

2. 使用场景

策略模式适用于以下几种场景:

  1. 多个算法可以互换: 当一个系统需要在运行时动态地选择其中一个算法时,策略模式是非常适用的。例如,支付系统可能需要支持多种支付方式,如信用卡支付、支付宝支付和微信支付

  2. 算法的变化独立于使用算法的客户端: 当算法的实现细节需要对客户端隐藏时,通过策略模式可以将算法封装在独立的策略类中,从而使得客户端代码与具体的算法实现解耦。

  3. 避免使用多重条件语句(如 if-elseswitch-case: 当多个条件语句控制着许多不同的行为时,可以将这些行为移到策略类中,以避免多重条件语句,使代码更可读和更易维护。

  4. 需要灵活地替换和复用算法时: 当系统中的某个行为有很多种实现方式,并且这些实现方式需要灵活地互相替换时,可以使用策略模式。

  5. 需要根据不同的环境或条件动态地选择算法时: 当算法的选择依赖于某些特定的条件或环境时,策略模式可以让这些条件或环境动态地决定使用哪种策略。

以下是几个具体的应用场景:

  1. 排序算法: 一个系统可以支持多种排序算法(如快速排序、归并排序、插入排序等),策略模式可以让系统在运行时选择合适的排序算法。

  2. 数据压缩: 一个文件压缩系统可以支持多种压缩算法(如 ZIP、RAR、GZIP 等),策略模式可以让用户选择所需的压缩算法。

  3. 路径查找: 在地图应用中,可以使用不同的路径查找算法(如最短路径、最少收费路径等),策略模式可以让用户选择不同的路径查找策略。

  4. 日志记录: 一个日志系统可以支持多种日志记录方式(如文件日志、数据库日志、远程日志等),策略模式可以让系统在运行时选择合适的日志记录策略。

  5. 促销活动: 电子商务系统中的促销活动可能有多种计算方式(如满减、打折、积分兑换等),通过策略模式可以灵活地切换不同的促销策略。

通过使用策略模式,可以使系统具有更好的扩展性和灵活性,能够更容易地应对变化和扩展需求。

3. 简单代码实现【策略模式实现一个系统支持多种压缩策略】

// 上下文类

package strategy

/*
策略模式上下文类:
    1. 通过上下文类选择具体的策略
    2. 通过上下文类执行具体的策略
*/

type CompressContext struct {
    compressor Compressor
}

// SetCompressor 通过上下文类选择具体的策略
func (c *CompressContext) SetCompressor(compressor Compressor) {
    c.compressor = compressor
}

// CompressFile 通过上下文类执行具体的策略
func (c *CompressContext) CompressFile(file string) string {
    if c.compressor == nil {
       return "No compression algorithm selected"
    }
    return c.compressor.Compress(file)
}


// 策略接口
package strategy

// Compressor 是一个压缩接口,定义了压缩方法
type Compressor interface {
    Compress(file string) string
}


// 具体策略
package strategy

type ZipCompressor struct{}

func (z *ZipCompressor) Compress(file string) string {
    return file + ".zip"
}


package strategy

// RarCompressor 实现了 Compressor 接口
type RarCompressor struct{}

func (r *RarCompressor) Compress(file string) string {
    return file + ".rar"
}

package strategy

// GzipCompressor 实现了 Compressor 接口
type GzipCompressor struct{}

func (g *GzipCompressor) Compress(file string) string {
    return file + ".gz"
}


// 客户端实现,运行时换策略
func main() {
    file := "test.txt"
    context := &strategy.CompressContext{}

    // 以下属于运行时修改策略
    // 选择策略gzip
    context.SetCompressor(&strategy.GzipCompressor{})
    fmt.Println(context.CompressFile(file))

    // 选择策略zip
    context.SetCompressor(&strategy.ZipCompressor{})
    fmt.Println(context.CompressFile(file))

    // 选择策略rar
    context.SetCompressor(&strategy.RarCompressor{})
    fmt.Println(context.CompressFile(file))
}

 4. 优缺点

策略模式的优点包括:

  • 可以在运行时更改对象的行为。

  • 可以避免使用多重条件语句(如 if-elseswitch-case),使代码更简洁。

  • 符合开闭原则(对扩展开放,对修改关闭),添加新算法时只需要添加新的策略类,而无需修改现有代码。

缺点包括:

  • 客户端必须了解所有的策略类,以便选择合适的策略。

  • 可能会增加系统中类的数量,导致代码复杂度增加。

5. 策略模式与工厂模式的不同点

  • 目的不同

    • 策略模式的目的是让算法可以互换,且客户端可以在运行时选择不同的策略。

    • 简单工厂模式的目的是简化对象的创建过程,将创建对象的逻辑集中到一个工厂类中。

  • 灵活性和扩展性

    • 策略模式更灵活,可以在不修改现有代码的前提下增加新的策略。

    • 简单工厂模式相对不太灵活,增加新产品时需要修改工厂类。

  • 使用时机

    • 策略模式适用于算法需要频繁变化或者需要在运行时选择不同算法的情景。

    • 简单工厂模式适用于对象创建过程复杂且变化不频繁的情景。 

举个不怎么恰当的例子可以加深理解:

简单工厂模式就好比如:把一个轮船在一个指定的流水线生产出来,后续用于载人,载物都可以,该工厂是不会管的,属于是一种创建的模式;【注重的是简化创建过程,可以理解为静态的,变化不频繁】

策略模式就好比如:在旅行的途中,遇到水路我可以选择坐轮船,也可以选择坐飞机,可以随意选择,遇到陆地,我可以选择打车,也可以选择走路。属于是一种自主选择的行为。【注重的是简化切换过程,动态的,切换比较频繁】 

 

标签:策略,可以,模式,算法,file,设计模式,string
From: https://blog.csdn.net/qq_40840571/article/details/141613301

相关文章

  • [设计模式]策略模式
    publicinterfaceStrategy{voiddoWork();}publicclassAliPayimplementsStrategy{@OverridepublicvoiddoWork(){System.out.println("正在使用支付宝支付");}}publicclasswxPayimplementsStrategy{@Overridepubl......
  • 生产者消费者模式,以及基于BlockingQueue的快速实现
    生产者消费者模式,以及基于BlockingQueue的快速实现什么是生产者消费者模式,简单来说就是有两个角色,一个角色主要负责生产数据,一个角色主要负责消费(使用)数据。那么生产者直接依赖消费者,然后直接调用是否可以?答案是可以的,但是有些场景无法及时解决,典型的就是生产者消费者的速度无法同......
  • 电子产品风扇调速策略、方法与步骤
     ......
  • 006 高级路由技术:多路径与策略路由
    引言在复杂的网络中,多路径路由和策略路由可以帮助优化流量和实现更灵活的路由策略。本篇博文将深入探讨这些高级路由技术,并展示它们在实际网络中的应用。1.多路径路由(Equal-CostMulti-Path,ECMP)ECMP允许路由器在多条等价路径之间分担流量,提高网络资源利用率和冗余性。E......
  • 004 路由算法与路径选择策略
    引言路径选择是路由器的核心功能,决定了数据包从源头到达目的地的路径。本篇博文将深入探讨各种路由算法和路径选择策略,帮助你理解路由器如何在复杂网络中进行决策。1.路由算法分类静态路由:管理员手动配置,适用于简单、稳定的网络。静态路由具有高稳定性,但不具备自动恢复......
  • 设计模式command
    命令(Command)设计模式是一种行为型设计模式,它将请求封装为对象,从而使你可以将请求的发起者和请求的接收者解耦。这样,你可以使用不同的请求、队列或日志来管理请求,还可以支持可撤销的操作。以下是一个简单的命令模式的例子:假设我们有一个简单的遥控器,它可以控制灯的开和关。我们将......
  • 设计模式Chain of Responsibility(责任链)
    ChainofResponsibility(责任链)模式是一种行为型设计模式,用于处理请求的多个处理者之间的职责分配。它允许请求沿着一条处理链传递,直到有一个处理者能够处理它为止。这种模式可以避免请求发送者和请求处理者之间的紧耦合关系。主要概念Handler(处理者):定义了处理请求的接口,并实现......
  • Capital许可分配策略
    在数字化浪潮席卷全球的今天,软件许可管理已成为企业运营不可或缺的一环。Capital许可分配策略,作为业界领先的解决方案,旨在帮助企业实现智能管理、优化资源,进而提升整体运营效率。一、什么是Capital许可分配策略?Capital许可分配策略是一种基于企业实际需求的软件许可分配方案。它......
  • 深度剖析:医疗行业财务报表的核心要素与解析策略
    在当今医疗行业中,财务报表分析扮演着至关重要的角色。医疗机构需要通过对财务数据的准确分析来做出关键决策,管理资源,改善效率,并确保最终提供高质量的医疗服务。本文将深入探讨医疗行业中财务报表分析的重要性、关键指标和分析方法,帮助大家更好地理解和了解财务报表在医疗行业中......
  • redis-删除策略
    Redis过期删除策略作者:w08e博客:https://www.cnblogs.com/w08e......