首页 > 其他分享 >【设计模式】之策略模式

【设计模式】之策略模式

时间:2022-09-23 14:47:37浏览次数:42  
标签:Transportation 策略 void 模式 strategy class run 设计模式 public

场景引入

假如你在A城市,要去B城市旅游,交通方式有以下几种选择:

  1. 驾车
  2. 火车
  3. 飞机

不难写出这样的代码:

void transport(string method)
{
    if (method == "drive")
    {
        // 处理驾车相关业务逻辑
    }
    else if (method == "train")
    {
        // 处理乘坐火车相关业务逻辑
    }
    else
    {
        // 处理乘坐飞机相关业务逻辑
    }
}

想一想,有什么问题?

屏幕前的你应该已经想到了,如果增加一种交通方式的话,是不是得增加if-else分支?这样就需要大量的修改,不符合开闭原则。

那怎么样能做到在不对源代码直接修改的前提下增加交通方式呢?答案是:把不同交通方式的业务逻辑抽离出来单独做成接口。

首先我们要定义一个基类Transportation,作为这几个交通方式的父类。这个Transportation有个纯虚函数run,从Transportation派生出DriveTrainPlane等子类(叫做策略类),重写run函数。这时的类体系如下:

代码如下:

class Transportation
{
public:
    virtual void run() = 0;
}

class Drive : public Transportation
{
public:
    void run() override
    {
        // 处理驾车相关业务逻辑
    }
}

class Train : public Transportation
{
public:
    void run() override
    {
        // 处理乘坐火车相关业务逻辑
    }
}

class Plane : public Transportation
{
public:
    void run() override
    {
        // 处理乘坐飞机相关业务逻辑
    }
?

此时多态就体现出来了,使用不同的类,调用run函数,就会做出不同的行为。

那怎么样来使用这些策略类呢?我们再新增一个类Context,可以根据传入的策略类做相应的处理:

class Context
{
    Transportation &strategy;
public:
    explicit Context(Transportation &strategy) : strategy(strategy) { }

    void run()
    {
        strategy.run();
    }
}

定义

策略模式(Strategy Pattern):一个类的行为或其算法可以在运行时更改的设计模式。

主要使用场景

有多种算法,希望避免因为多个if-else分支而带来的难以维护和扩展的问题。

优缺点

优点

  1. 可维护性、可扩展性高。
  2. 对客户隐藏了具体的实现细节

缺点

  1. 客户端必须要知道所有的策略类,并自行选择要用哪一个策略类。

标签:Transportation,策略,void,模式,strategy,class,run,设计模式,public
From: https://www.cnblogs.com/YWT-Real/p/16720704.html

相关文章

  • 享元模式
    理论享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。内部状态与外部状态:在享元对象内部并且不会随环境变化而改变的共享部分,称为享元对象的内部状态。而随......
  • 组策略编辑器(gpedit.msc)找不到文件解决方法
    打开【此电脑】中的C盘,依次打开Windows-system32-gpedit.msc,或者输入:C:\Windows\System32\gpedit.msc,查看是否存在gpedit.msc文件(没有文件则表明未安装组策略编辑器)安装......
  • 设计模式-结构型模式之装饰器
    实现AOP(面向切面编程)的一种便捷方式,额外扩展统一管理装饰器的实现我在语言进阶篇中有提到,这里不再赘述1fromdecoratorimportdecorator234@decorator5......
  • 策略模式演示
    参考:AwardSuper.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceStrategyMode{abstractclassAwardSuper{pub......
  • 设计模式-结构型模式之外观
    简化应用程序内部接口,提供一个单一接口以供外部(前端or客户侧)调用1classValley:23defrun(self):4self.pre_declare()5self.declar......
  • 设计模式之(12)——外观模式
    外观模式(facadePattern)又叫门面模式,隐藏了子系统的复杂实现,为子系统中的一组接口提供了一个统一的访问入口,使得子系统容易被访问或使用,说白了就是把复杂的子系统封装成......
  • 1.设计模式-单例
    单例模式单例模式的核心是保证一个类只有一个实例,并且提供一个访问实例的全局访问点。单例的使用场景Spring中bean对象的模式实现方式servlet中每个servlet的实例s......
  • Python实现单例模式
    单例模式介绍:单例模式是一种常用的软件设计模型,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。......
  • 设计模式-创建型模式之工厂
    一、简单工厂创建对象的工作交由统一的函数接口来管理,传入不同的参数,返回不同的类对象1classAqSb:23def__repr__(self):4return"按期申......
  • JAVA中容器设计的进化史:从白盒到黑盒,再到跻身为设计模式之一的迭代器
    大家好,又见面了。在我们的项目编码中,不可避免的会用到一些容器类,我们可以直接使用List、Map、Set、Array等类型。当然,为了体现业务层面的含义,我们也会根据实际需要自行封......