设计模式学习
设计模式的作用是 在稳定和变化之间寻找一个间隔层,将稳定部分和变化分割开,提高软件复用性。
一、软件设计思想
1.理解松耦合设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF 核心设计模式
二、设计原则
1.依赖倒置原则(DIP)
稳定(抽象) 依赖 稳定; 不稳定 (实现细节,易变化)依赖 稳定。
2.开放封闭原则(OCP)
对扩展开放,对更改封闭;就是增加一个需求时,只需要增加代码就好,而不是去修改以往代码。具有扩展性
3、单一职责原则
一个类只有一个责任
4.Liskov替换原则
子类必须能够替换他们的基类(IS-A)
5.接口隔离原则
接口应该小而完备;不对外暴露的接口就使用private
6.优先使用对象组合,而不是继承
因为继承的话 父类和子类耦合度较高,组合的耦合性低,只需弄好接口
7 封装变化点
使用封装来创建对象之间的分界层,设计者在一侧修改而不会对另一侧产生不良影响
8 针对接口编程 ,而不是针对实现编程
接口返回值是一个抽象类
三、重构技法
静态->动态 早绑定->晚绑定 继承->组合 编译时依赖->运行时依赖 紧耦合->松耦合
四、具体设计模式
1.策略模式Template Method
有一个卫星任务规划软件,内含多颗卫星的任务规划,以下是一种做法;
enum class Satellite{ // 卫星代号
GF_1,
GF_2,
GF_3
};
class SatelliteTaskPlan // 卫星任务规划类
{
private:
/* data */
Satellite SateNumber;
public:
int TaskPlan(){
/* code */
if(SateNumber==Satellite::GF_1){
/* code */
}else if (SateNumber==Satellite::GF_2)
{
/* code */
}else if (SateNumber==Satellite::GF_3)
{
/* code */
}
}
SatelliteTaskPlan(/* args */);
~SatelliteTaskPlan();
};
但此做法违反了设计原则2:开闭原则,如果添加高分4号、5号等,就需要更改代码,而不是添加代码,复用性降低了。考虑重构:
class SatelliteStrategyBase // 卫星任务规划基类
{
public:
virtual int TaskPlan(const Context &context) = 0;
virtual ~SatelliteStrategyBase();
};
class TaskPlanForGF_1 : public SatelliteStrategyBase
{
public:
virtual int TaskPlan(const Context &context)
{
/* code */
}
};
class TaskPlanForGF_2 : public SatelliteStrategyBase
{
public:
virtual int TaskPlan(const Context &context)
{
/* code */
}
};
class TaskPlanForGF_3 : public SatelliteStrategyBase
{
public:
virtual int TaskPlan(const Context &context)
{
/* code */
}
};
class SatelliteTaskPlan // 卫星任务规划类
{
private:
SatelliteStrategyBase *stra