面向对象设计原则
总纲:低耦合(模块与模块之间,类与类之间)、高内聚(模块颞部或类内部的关系)
在大多数情况下,开闭原则,里氏替换原则和依赖倒置原则会同时出现;开闭原则是目标,里氏替换原则是基础,依赖倒置原则是手段;
1,单一职责原则S
核心:一个类,或一个模块,最好只做一件事,只有一个引起类或模块变化的外因。
此原则核心是 解耦 和 增强内聚性
例子:将长方形类的画图与计算功能分开,这样,计算面积就是计算面积,画图就是画图。
2,开放闭合原则O
核心:对扩展开放,对修改关闭
例子:版本升级,不该源代码,原来的功能是可以使用的。计算器代码的实现:分别设计加减乘除,不如直接使用继承,实现虚方法。
class Calculator
{
public:
int plus(int x,int y)
{
...
}
int minus(int x,int y)
{
...
}
int multiply(int x,int y)
{
...
}
int divide(int x, int y)
{
...
}
}
clsaa Calclator
{
public:
virtual int getResult(int x, int y)=0;
virtual ~Calculator(){}
};
class plusCalculator
:public Calculator
{
public:
virtual int getResult(int x,int y)
{
return x+y;
}
~plusCalculator()
{
}
};
class MinusCalculator
:public Calculator
{
public:
virtual int getResult(int x,int y)
{
return x-y;
}
~MinusCalculator()
{
}
};
class MultiplyCalculator
:public Calculator
{
public:
virtual int getResult(int x,int y)
{
return x*y;
}
~MultiplyCalculator()
{
}
};
class DivideCalculator
:public Calculator
{
public:
virtual int getResult(int x,int y)
{
if(0!=y)
{
return x/y;
}
else
{
cout<<"除数不能为0"<<endl;
return -1;
}
}
~DivideCalculator()
{
}
};
3,里氏替换原则L
核心:派生类必须能替换基类
派生类可以扩展基类的功能,但不能改变基类原有的功能。
表现:子类可以实现父类的抽象方法,表现多态;但不能覆盖父类的非抽象方法;子类可以有自己的个性;
4,接口分离原则I
核心原则:使用多个小的专门的接口,而不要使用一个大的总接口。
例子:鸟与鸵鸟。
5,依赖倒置原则D
核心:面向接口编程,依赖于抽象(抽象是稳定的,具体的是在变化的)
在此处 面向接口编程,说的就是纯虚函数,包含纯虚函数的类,称为抽象类,抽象类是稳定不变的。
例子:银行业务类。
6,迪米特原则(最少知识原则)
一个软件实体应尽可能少的与其他实体发生作用
核心:尽量降低类与类之间的耦合,减少类与类之间的关联程度。
例子:楼盘买房问题
7,组合复用原则
核心:尽量采用组合,聚合的方式而不是继承的方式来达到软件复用的的目标
七大设计原则的总结
原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。