设计模式-策略模式

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
继承自基类的派生类之间有许多不同的特点,比如鹦鹉继承自鸟类,但是颜色各有不同。可以在基类中定义一个虚函数,每个派生类中分别实现,这种方法使得代码重复,代码量变大,且增加维护成本。
策略模式的方法为定义算法族,算法族继承自算法族基类,对象基类中利用多态性增加指向算法族基类指针。创建不同派生类时,将算法族指针指向不同的算法,使得代码重复得到解决。并且可以动态的改变算法族指针,使得派生类在运行时可以动态的改变行为。
例:
mallardDuck,modelDuck,miniDuck均继承自基类Duck,三者会不会飞的行为各有不同,定义基类Duck,其中fly*为指向算法族基类的指针,通过flying()函数调用flyBehavior()函数。在Duck类中我们不关心派生类中的flyBehavior具体实现,实现交给算法族处理。

//Duck.h
#include <stdio.h>
#include "fly.h"
class Duck{
public:
    fly* flyBeh;//算法族基类指针

    Duck(){
        flyBeh = new flyWithWings();//将flyBeh指向flyWithWings类
    }
    ~Duck(){}
    void move(){
        printf("move\n");
    }
    void flying(){
        flyBeh->flyBehavior();//flyBehavior为算法族基类fly类中定义的纯虚函数
    }
    void setFlyBehavior(fly* flyBehavior){
        flyBeh = flyBehavior;//通过设置flyBeh指向算法组中不同的算法以在运行时动态的改变行为。
    }    
};

fly.h为算法族,派生类均继承自fly基类,实现flyBehavior方法。使得在算法族中又三种不同的飞行方式。三种方式均可由指向fly类型的指针调用。

//fly.h
#ifndef ________fly__
#define ________fly__

#include <stdio.h>
class fly{
public:
    virtual void flyBehavior()=0;
};

class flyWithWings : public fly{
//分别实现flyBehavior方法
    void flyBehavior(){
        printf("flyWithWings\n");
    }
};

class flyNoWay : public fly{
    void flyBehavior(){
        printf("flyNoWay\n");
    }
};

class flyWithRocket : public fly{
    void flyBehavior(){
        printf("flyWithRocket\n");
    }
};

在三种鸭子的构造函数中,使flyBeh指向不同的算法即可实现不同鸭子的不同飞行方式

//MallardDuck.h
#ifndef ________MallardDuck__
#define ________MallardDuck__
//绿头鸭
#include <stdio.h>
#include "Duck.h"
#include "fly.h"
class MallardDuck:public Duck, public flyWithWings{
public:
    MallardDuck(){
        flyBeh = new flyWithWings();//指向用翅膀飞行算法
    }
};


//ModelDuck.h
#ifndef ________ModelDuck__
#define ________ModelDuck__

#include <stdio.h>
#include "Duck.h"
#include "fly.h"
class ModelDuck:public Duck,public flyNoWay{
public:
    ModelDuck(){
        flyBeh = new flyNoWay();//模型鸭子指向不能飞行
    }
};


//MiniDuck.h
#ifndef ________MiniDuck__
#define ________MiniDuck__

#include <stdio.h>
#include "Duck.h"
#include "fly.h"
class MiniDuck:public Duck,public flyNoWay{
public:
    MiniDuck(){
        flyBeh = new flyNoWay();//mini鸭指向不能飞行
    }
};

#endif /* defined(________MiniDuck__) */

主函数:

//main.h
#include <iostream>
#include "Duck.h"
#include "MallardDuck.h"
#include "ModelDuck.h"
#include "MiniDuck.h"
#include "fly.h"


int main(int argc, const char * argv[]) {
    auto duck = new Duck();
    printf("duck\n");
    duck->move();
    duck->flying();
    printf("\n\n");

    printf("mallardDuck\n");
    auto mallardDuck = new MallardDuck();
    mallardDuck->flying();//绿头鸭的飞行方式
    printf("\n\n");



    printf("modelDuck\n");
    auto modelDuck = new ModelDuck();
    modelDuck->flying();//模型鸭的飞行方式
    modelDuck->setFlyBehavior(new flyWithRocket());//运行是动态的改变飞行方式
    modelDuck->flying();
    printf("\n\n");

    printf("miniDuck\n");
    auto miniDuck = new MiniDuck();
    miniDuck->flying();
    printf("\n\n");
    return 0;
}

输出:
duck
move
flyWithWings

mallardDuck
flyWithWings

modelDuck
flyNoWay
flyWithRocket (动态的改变了飞行方式)

miniDuck
flyNoWay

总结:
策略模式把应用中需要变化的内容抽出来,使用算法族的方式实现,在创建对象时在算法族中挑选算法,最后组装成一个完整的对象。

设计原则:
找出应用中可能需要变化之处,把他们独立出来,不要和那些不用变化的代码混合在一起。
针对接口编程,而不是针对实现编程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值