zoukankan      html  css  js  c++  java
  • 设计模式(一):策略模式

    “把模式装进你的脑子里面,然后在你的设计和已有的应用中,寻找何处可以使用它们。”


    a.策略模式:
    假设有个Duck类,类中需要fly和quack接口,一个表示鸭子会飞,一个表示鸭子的叫声。如果需要产生一个橡皮鸭子,就需要从鸭子类继承产生,但是fly也会被继承下来。实际上橡皮鸭子被限制为不会飞(当然,也可以在橡皮鸭中,将fly接口重新实现。但是,实例仍然调用的是叫fly的接口,却使得橡皮鸭不能飞。有点矛盾!)。而且,当需要产生很多不同种的鸭子类型的时候,可能重新构造fly接口的工作很多,这导致了不必要的重复。
    这样就导致了策略模式的产生:

    定义:
    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,这个行为有不同的实现算法。例如,播放器类中的播放行为,可以设置为不同的场景,如剧场,流行等等。

    C++实现:(由于本人对C++比对JAVA熟悉一点,代码摘自维基百科。后面附自己想到的一个例子。)

    #include <iostream>
    #include <string>
    
    #include <assert.h>
    
    using namespace std;
    
    
    //create abstract class
    class StrategyInterface
    {
    public:
        virtual void excute() = 0;
    
        /* data */
    };
    
    class ConcreteStrategyA : public StrategyInterface
    {
    public:
        virtual void excute()
        {
            cout << "This is ConcreteStrategyA." << endl;
        }
    
        /* data */
    };
    
    class ConcreteStrategyB : public StrategyInterface
    {
    public:
        virtual void excute()
        {
            cout << "This is ConcreteStrategyB." << endl;
        }
    
        /* data */
    };
    
    class ConcreteStrategyC : public StrategyInterface
    {
    public:
        virtual void excute()
        {
            cout << "This is ConcreteStrategyC." << endl;
        }
    
        /* data */
    };
    
    class Context
    {
    public:
        Context( StrategyInterface *strategy ):strategy( strategy ){}
        void SetStrategy( StrategyInterface *pStrategy )
        {
            strategy = pStrategy;
        }
    
        void excute()
        {
            strategy->excute();
        }
    
    private:
        StrategyInterface *strategy;
        /* data */
    };
    
    int main()
    {
        ConcreteStrategyA concreteStrategyA;
        ConcreteStrategyB concreteStrategyB;
        ConcreteStrategyC concreteStrategyC;
    
        Context contextA( &concreteStrategyA );
        Context contextB( &concreteStrategyB );
        Context contextC( &concreteStrategyC );
    
        contextA.excute();
        contextB.excute();
        contextC.excute();
    
        contextA.SetStrategy( &concreteStrategyB );
        contextA.excute();
        contextB.SetStrategy( &concreteStrategyC );
        contextB.excute();
    
    
    
        return 0;
    }       

        这个模式其实就是将行为抽象出来。我自己又根据这个策略,想到一个例子,例如播放MP3的时候,可以选择音乐的场景,究竟是流行,剧场,jazz还是其他。

    class ScenarioInterface
    {
    public:
        virtual void play() = 0;
    
        /* data */
    };
    
    class Theatre : public ScenarioInterface
    {
    public:
        virtual void play()
        {
            cout << "Play music in the Theatre scenario." << endl;
        }
    
        /* data */
    };
    
    class Pop : public ScenarioInterface
    {
    public:
        virtual void play()
        {
            cout << "Play music in the pop scenario." << endl;
        }
    
        /* data */
    };
    
    class Classic: public ScenarioInterface
    {
    public:
        virtual void play()
        {
            cout << "Play music in the classic scenario." << endl;
        }
    
        /* data */
    };
    
    class Jazz : public ScenarioInterface
    {
    public:
        virtual void play()
        {
            cout << "Play music in the Jazz scenario." << endl;
        }
    
        /* data */
    };
    
    class Mp3
    {
    public:
        Mp3( const string &name, ScenarioInterface *pSecn ) : songName( name ), scenario( pSecn )
        {
        }
    
        ~Mp3()
        {
        }
    
        //modify the scenario
        void SetScenario( ScenarioInterface *pScen )
        {
            scenario = pScen;
        }
    
        void PlayMusic()
        {
            cout << "The name of the song is :" << songName << "."<< endl;
            scenario->play();
        }
    
    
    private:
        string songName;
        ScenarioInterface *scenario;
    
        /* data */
    };
    
    
    int main()
    {
        Pop pop;
        Theatre theatre;
        Classic classic;
        Jazz jazz;
    
    
        Mp3 mp3A( "I belive.", &pop );
        mp3A.PlayMusic();
    
        Mp3 mp3B( "In the end.", &theatre );
        mp3B.PlayMusic();
    
        Mp3 mp3C( "Numb.", &theatre );
        mp3C.PlayMusic();
        mp3C.SetScenario( &jazz );
        mp3C.PlayMusic();
    
    
    
        return 0;
    }
  • 相关阅读:
    先做人,再做事
    当ligerui的grid出现固定列与非固定列不在同一水平线上时,改怎么处理
    权限设计的idea
    ligerUI问题
    在程序出现问题,当找不到错误时,第一时间用try ,catch包括起来
    当页面是本地页面时,通过ajax访问tomcat里的action,传递的参数在action里并不能识别
    好句子
    js Uncaught TypeError: undefined is not a function
    Photoshop学习笔记(一)
    microsoft project 出现不能保存为xls文件时可以按照如下方法解决
  • 原文地址:https://www.cnblogs.com/bracken/p/2978473.html
Copyright © 2011-2022 走看看