设计模式之策略模式

在很多情况下,我们一个对象的同一个方法可能在不同的情况下表现形式不同,例如:我们早上如何去上班这个问题,通常情况下可以选择乘公交、坐地铁。可是在某些情况下(比如脑子一热想健身)我们也可以骑自行车或者跑着去公司,此时虽然我们都是要去公司,但是去公司的方式却不同,在这种情况下我们就可以用到我们的策略模式了。

记住:有一个去公司的方法可能比坐地铁是去公司的方法更好(有一个比是一个可能更好!)。

好了不废话,直接看代码:

//首先我们需要一个去上班方式的基类,并在该类中声明“去上班”的接口函数。
class CGoToWorkWay
{
public:
    CGoToWorkWay() = default; //默认构造函数
    virtual void run() = 0;      //声明为纯虚函数,防止用户直接构造该类。
};

//接下来我们就需要去实现几种去上班的方法了
class CBySubway :public CGoToWorkWay
{
public:
    CBySubway() = default;
    void run()
    {
	cout << "bySubWay"<<endl;
    }
};

class CByBus :public CGoToWorkWay
{
public:
    CByBus() = default;
    void run()
    {
	cout << "ByBus" << endl;
    }
};

class CWalk :public CGoToWorkWay
{
public:
    CWalk() = default;
    void run()
    {
	cout << "Walk" << endl;
    }
};

class CByBike :public CGoToWorkWay
{
public:
    CByBike() = default;
    void run()
    {
	cout << "ByBike" << endl;
    }
};

//最后我们声明一个Person类,在里面添加去上班的方法,并在该方法中调用上面我们CGoToWorkWay类中的接口函数。
class Person
{
public:
    Person(shared_ptr<CGoToWorkWay>  pWay):m_cGoToWork(pWay)
    {
    };

    void GoToWork()
    {
	if (m_cGoToWork)
	{
	    m_cGoToWork->run();
	}
    }

    void ChangeGoWorkWay(shared_ptr<CGoToWorkWay>  pWay)
    {
	m_cGoToWork = pWay;
    }
private:
    shared_ptr<CGoToWorkWay> m_cGoToWork;
};

//最后我们试验一下
int main()
{
    shared_ptr<CGoToWorkWay> way = make_shared<CBySubway>();
    Person *p = new Person(way);
    p->GoToWork();

    way = make_shared<CByBus>();
    p->ChangeGoWorkWay(way);
    p->GoToWork();

    way = make_shared<CWalk>();
    p->ChangeGoWorkWay(way);
    p->GoToWork();

    way = make_shared<CByBike>();
    p->ChangeGoWorkWay(way);
    p->GoToWork();
    return 0;
}


输出结果:
bySubWay
ByBus
Walk
ByBike

设计原则:

1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2. 针对接口编程,而不是针对实现编程。

3. 多用组合,少用继承。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值