设计模式之策略模式

来源:互联网 发布:程序员常用工具 知乎 编辑:程序博客网 时间:2024/06/02 03:50

设计模式之策略模式

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

提供一种方式来应对某些需求的变化
举个例子来说,我们平时都知道超时经常会有各种活动,比如满300减50,或者全场85折等等各种活动,但是这些活动并不是一次全出来,它是过一段时间一个活动,其实这些降价活动想的简单一点,它就是一种算法,就是一种策略,和钱有关的一种算法

那么我们可以写出下面代码

#include<iostream>using namespace std;#if 0class Strategy{public:virtual double Money(double money) = 0;};class StrategyA:public Strategy{double Money(double money){if (money > 300){money = money - 50;}return money;}};class StrategyB :public Strategy {double Money(double money){return 0.85*money;}};//以上就是两种策略,我们知道平时超市都会有收银员,他们是这些策略(算法)的执行者执行者class CashContext{//他们要知道调用那种策略private:Strategy* stragegy;public:CashContext(Strategy* stragegy){this->stragegy = stragegy;}void setStrategy(Strategy* stragegy){this->stragegy = stragegy;}double GetResult(double money){return this->stragegy->Money(money);}~CashContext(){if (stragegy != NULL){delete stragegy;stragegy = NULL;}}};int main(void){Strategy* strategy1 = new StrategyA();Strategy* strategy2 = new StrategyB();CashContext* context = new CashContext(strategy1);cout << "消费800元,满300-50后收费为:" << context->GetResult(800) << endl;delete strategy1;strategy1 = NULL;delete strategy2;strategy2 = NULL;return 0;}
下面让我们开看一看它的类图和具体的代码

具体代码:

class Strategy{public:virtual void Method() = 0;};class ConcreteStrategyA:public Strategy{public:void Method(){cout << "具体方法A的实现" << endl;}};class ConcreteStrategyB :public Strategy{public:void Method(){cout << "具体方法B的实现" << endl;}};class Context{private:Strategy* strategy;public:Context(Strategy* strategy){this->strategy = strategy;}void setStrategy(Strategy* strategy){this->strategy = strategy;}void method(){strategy->Method();}};
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的动作,只是实现不同而已,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合

策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

只要在分析过程中听到需要在不同的时间用不同的业务规则,这个时候我们就可以考虑使用策略模式

适用情况:

1、很多相关的类只是在行为上有差异

2、当需要使用一个算法的不同变体时

3、使用算法的客户不知道算法的具体结构时

4、当一个类定义了多种行为并且这些行为在这个类的操作中以多个条件语句的形式出现时

原创粉丝点击