行为型模式-策略模式

策略模式

  • 一个类的行为或其算法可以在运行时更改

  • UML类图:
    在这里插入图片描述


例子:

促销策略



class SaleStrategy
{
public: 
	virtual void SaleWay() = 0;
};


class StrategyA :public SaleStrategy
{
public:
	virtual void SaleWay()
	{
		cout << "打8折" << endl;
	}


};

class StrategyB :public SaleStrategy
{
public:
	virtual void SaleWay()
	{
		cout << "满200元,反现金100" << endl;
	}


};

策略使用者

class Salesman
{
public:

	void SetStrategy(SaleStrategy* strategy)
	{
		m_strategy = strategy;
	}

	void Yell()
	{
		m_strategy->SaleWay();
	}
	SaleStrategy* m_strategy;
};

调用:


int main(void)
{

	SaleStrategy* strategy1 = NULL;
	Salesman julian;


	strategy1 = new StrategyA;       //策略1
	julian.SetStrategy(strategy1);
	julian.Yell();

	cout << "--------------" << endl;

	strategy1 = new StrategyB;       //策略2
	julian.SetStrategy(strategy1);
	julian.Yell();



	return 0;
}

结果:先使用策略A , 然后使用策略B
在这里插入图片描述


  • 优点:
     (1) 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

  (2)策略模式提供了一种算法的复用机制。由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类

  (3 )使用策略模式可以避免多重条件选择语句,多重条件选择语句不易维护。

  • 缺点:
      (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
      (2)策略模式将造成系统产生很多具体策略类。

  • 使用场景:
        准备一组算法,并将每一个算法封装起来,使得它们可以互换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值