设计模式(策略模式)

2017-01-10

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!!

设计模式:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式的六大原则:

  1. 开闭原则:

    对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,实现一种热插拔的效果。这样有利于程序的可维护性和易升级性。

  2. 里氏代换原则:

    里氏代换原则是面向对象设计的基本原则之一,里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现,里氏代换原则是继承复用的基础,只有当派生类可以替换基类,且原有功能不被影响时基类才能真正被复用,而派生类也能够在基类的基础上新增新的行为。里氏代换原则是对开闭原则的补充,实现开闭原则的关键步骤就是抽象化,而基类和子类的继承关系就是抽象化的具体实现。

  3. 依赖倒转原则:

    这个原则是开闭原则的基础,它是针对接口编程,依赖抽象而不依赖具体

  4. 接口隔离原则:

    使用多个隔离的接口,比使用单个接口要好。它的另外一个意识是降低类之间的耦合度。

  5. 迪米特法则:

    迪米特发展又称最少知道原则,一个实体应当尽量少的与其它实体之间发生相互作用,使得系统功能模块相对独立。

  6. 合成复用原则:

    尽量使用合成/聚合的方式,而不是使用继承方式。

策略模式

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

优点

  1. 算法可以自由切换
  2. 避免使用多重条件判断
  3. 可扩展性良好

缺点

  1. 策略类增多
  2. 所有的策略类都需要对面暴露

UML类图结构

实现

创建一个抽象收费类CCashSuper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __CASHSUPER__
#define __CASHSUPER__
#include<iostream>
class CCashSuper
{
public:
CCashSuper(){};
virtual ~CCashSuper(){};
public:
virtual double acceptCash(double money) = 0;
};
#endif

实现正常收费子类CCashNormal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef __CASHNORMAL__
#define __CASHNORMAL__
#include<iostream>
#include "cashSuper.h"
class CCashNormal : public CCashSuper
{
public:
CCashNormal(){};
~CCashNormal(){};
public:
double acceptCash(double money)
{
return money;
}
};
#endif

实现打折收费子类CCashRebate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef __CASHREBATE__
#define __CASHREBATE__
#include "cashSuper.h"
class CCashRebate : public CCashSuper
{
public:
CCashRebate(double rebate = 0.0)
{
this->m_rebate = rebate;
};
~CCashRebate(){};
public:
double acceptCash(double money)
{
return money * m_rebate;
}
private:
double m_rebate;
};
#endif

实现返现收费子类CCashReturn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef __CASHRETURN__
#define __CASHRETURN__
#include "cashSuper.h"
class CCashReturn : public CCashSuper
{
public:
CCashReturn(double moneycondition = 1.0, double moneyReturn = 0.0)
{
this->m_moneycondition = moneycondition;
this->m_moneyReturn = moneyReturn;
};
~CCashReturn(){};
public:
double acceptCash(double money)
{
if(money > m_moneycondition)
{
return money - ((money / m_moneycondition) * m_moneyReturn);
}
}
private:
double m_moneycondition;
double m_moneyReturn;
};
#endif

实现收费工厂类CCashFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef __CASHCONTEXT__
#define __CASHCONTEXT__
#include<iostream>
#include "cashSuper.h"
#include "cashNormal.h"
#include "cashRebate.h"
#include "cashReturn.h"
#include <string.h>
class CCashFactory
{
public:
CCashFactory(){};
~CCashFactory(){};
public:
CCashSuper * createAcceptCash(std::string type)
{
if(strcmp((char*)"normal", type.c_str()) == 0)
{
return new CCashNormal();
}
else if(strcmp((char*)"rebate", type.c_str()) == 0)
{
return new CCashRebate(0.8);
}
else if(strcmp((char*)"return", type.c_str()) == 0)
{
return new CCashReturn(300, 100);
}
return 0;
}
};
#endif

客户端调用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "cashContext.h"
#include<iostream>
int main(void)
{
CCashFactory factory;
//不打折
CCashSuper *super = factory.createAcceptCash("normal");
double ret = super->acceptCash(100);
std::cout << "ret = " << ret << std::endl;
//打折
super = factory.createAcceptCash("rebate");
ret = super->acceptCash(100);
std::cout << "ret = " << ret << std::endl;
//返现
super = factory.createAcceptCash("return");
ret = super->acceptCash(500);
std::cout << "ret = " << ret << std::endl;
if(super != 0)
{
delete super;
super = 0;
}
return 0;
}

项目文件:https://github.com/Gavinxyj/designPattern


推荐我的微信公众号:爱做饭的老谢


上一篇:设计模式(抽象工厂模型)
下一篇:RabbitMq集群部署