栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式——策略模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式——策略模式

文章目录
  • 一、基本知识
    • 1.定义
    • 2.要点
  • 二、结构图
  • 三、实例说明
    • 1.普通代码
    • 2.策略模式代码


一、基本知识 1.定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户程序而变化。

2.要点

①策略模式提供了一系列可重用的算法,从而可以使得类型在运⾏时方便地根据需要在各个算法之间进行切换。
②策略模式消除了条件判断语句;也就是在解耦合。

二、结构图

三、实例说明

实例:某商场节假日有固定促销活动,为了加大促销力度,现提升国庆节促销活动规格。

1.普通代码
enum VacationEnum {
    VAC_Spring,
    VAC_QiXi,
    VAC_Wuyi,
    VAC_GuoQing,
    //VAC_ShengDan,
};

class Promotion {
    VacationEnum vac;
public:
    double CalcPromotion() {
        if (vac == VAC_Spring) {
            // 春节
        }
        else if (vac == VAC_QiXi) {
            // 七夕
        }
        else if (vac == VAC_Wuyi) {
            // 五一
        }
        else if (vac == VAC_GuoQing) {
            // 国庆
        }
    }

};

上面代码将所有节日都放到一个类里面,当一个节日的促销方案发生变化的话我们不得不修改类中的代码。由于所有节日都放到一个类里面,耦合度太高。

2.策略模式代码
//可以是促销的一些参数,也可以是其他的数据结构,主要看需要给节日穿什么参数
class Context {
};

class ProStategy {
public:
    virtual double CalcPro(const Context& ctx) = 0;
    virtual ~ProStategy();
};
// cpp
class VAC_Spring : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_QiXi : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
class VAC_QiXi1 : public VAC_QiXi {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_Wuyi : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};
// cpp
class VAC_GuoQing : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};

class VAC_Shengdan : public ProStategy {
public:
    virtual double CalcPro(const Context& ctx) {}
};

// 节日是稳定的  节日的促销策略是变化的
class Promotion {
public:
    Promotion(ProStategy* sss) : s(sss) {}
    ~Promotion() {}
    double CalcPromotion(const Context& ctx) {
        return s->CalcPro(ctx);
    }
private:
    ProStategy* s;
};

int main() {
    Context ctx;
    ProStategy* s = new VAC_QiXi1();
    Promotion* p = new Promotion(s);
    p->CalcPromotion(ctx);//就等同于直接 s->Calcpro();
    return 0;
}

这里把节日都分离开了。其实个人感觉每个设计模式之间都有或多或少其他设计模式的影子。因为设计模式的目标是一致的,就是尽可能满足设计模式(面向对象的)七大原则。只不过对于不同的类型的问题来说,尽可能满足这些要求而所需要的框架不同。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677714.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号