zoukankan      html  css  js  c++  java
  • 大话设计模式--策略模式 strategy -- C++实现实例

    1. 策略模式:

    它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户。

    用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合。

    实例中策略模式与工厂模式相结合,不同之处在于 main函数的使用体现,

    如果用但纯的工厂模式则必须知道两个类, 但是两种模式结合后,客户端只需要知道一个类 context .

    另外,工厂模式生产的是具体的算法, 而策略模式则是能通过不同策略调用不同算法,直接获取需要的结果。

    实例:

    strategy.h 策略基类

    #ifndef STRATEGY_H
    #define STRATEGY_H
    
    class Strategy
    {
    public:
        Strategy();
        void virtual AlgorithmInterface();
    };
    
    #endif // STRATEGY_H
    

    strategy.cpp

    #include "strategy.h"
    
    Strategy::Strategy()
    {
    }
    
    void Strategy::AlgorithmInterface()
    {
    
    }
    

    concretestrategy.h 具体策略实现, 省篇幅,写在一起

    #ifndef CONCRETESTRATEGY_H
    #define CONCRETESTRATEGY_H
    
    #include "strategy.h"
    
    class ConcreteStrategyA : public Strategy
    {
    public:
        void AlgorithmInterface();
    };
    
    class ConcreteStrategyB : public Strategy
    {
    public:
        void AlgorithmInterface();
    };
    
    class ConcreteStrategyC : public Strategy
    {
    public:
        void AlgorithmInterface();
    };
    
    #endif // CONCRETESTRATEGY_H

    concretestrategy.cpp

    #include "concretestrategy.h"
    #include <stdio.h>
    
    void ConcreteStrategyA::AlgorithmInterface()
    {
        printf("ConcreteStrategyA
    ");
    }
    
    void ConcreteStrategyB::AlgorithmInterface()
    {
        printf("ConcreteStrategyB
    ");
    }
    
    void ConcreteStrategyC::AlgorithmInterface()
    {
        printf("ConcreteStrategyC
    ");
    }
    


    context.h 上下文类

    #ifndef CONTEXT_H
    #define CONTEXT_H
    
    #include "strategy.h"
    #include "concretestrategy.h"
    #include <string>
    
    using namespace std;
    
    class Context
    {
    public:
        Context(string type);
        Strategy* strategy;
        void contextInterFace();
    
    };
    
    #endif // CONTEXT_H

    context.cpp

    #include "context.h"
    
    Context::Context(string type)
    {
        if( type == "A" )
            strategy = new ConcreteStrategyA();
        else if( type == "B" )
            strategy = new ConcreteStrategyB();
        else if( type == "C" )
            strategy = new ConcreteStrategyC();
    }
    
    void Context::contextInterFace()
    {
        strategy->AlgorithmInterface();
    }
    

    main.cpp

    #include <iostream>
    #include "context.h"
    
    using namespace std;
    
    int main()
    {
        cout << "strategy test!" << endl;
    
        Context *context = new Context("C");
        context->contextInterFace();
    
        return 0;
    }
    
    



     

  • 相关阅读:
    Vmware安装CentOs7.4
    记录一次简单的springboot发送邮件功能
    jenkins 脱机下 安装插件失败
    centos8系统下docker安装jenkins
    Flask快速入门(9) — 请求扩展
    Flask快速入门(8) — 闪现flash
    Flask快速入门(7) — session
    Flask快速入门(6) — 常见的请求与响应参数
    Flask快速入门(5) — 模板渲染
    Flask快速入门(4) — CBV写法与解析
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648200.html
Copyright © 2011-2022 走看看