什么是设计模式
“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 ——Christopher Alexander
松耦合:降低每个模块之间的依赖关系,减少后期的修改工作量
紧耦合:代码模块之间高度依赖,牵一发而动全身,不利于后期的修改
设计模式使用的目的是为了管理变化、提高复用。一般在程序稳定、需要提高其复用性、扩展性的时候可以使用设计模式,刚开始的时候可以暂不考虑使用设计模式。在代码书写不规范、需求简单、变化不明显的情况下不需要考虑设计模式的使用。
六大设计原则
设计模式依赖于设计原则。在实际工作中要根据实际代码违背了那些设计原则来对代码进行改进,提高复用性。
1.依赖倒置原则
-
高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
-
抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。
class ISoap
{
public:
virtual void process()=0;//抽象
}
class SFJSoap:public ISoap
{
public:
void process()
{
cout<<"舒肤佳";
}
.....
}
class MTSoap:public ISoap
{
public:
void process()
{
cout<<"满婷";
}
.....
}
class Man
{
puclic:
void Action(ISoap isoap)
{
isoap.process();
}
....
}
int main()
{
Man man = new Man();
ISoap isoap = new SFJSoap();
man->Action(isoap);
ISoap isoap1 = new MTSoap();
Man->Action(isoap1);
....
}
-
总结:要面向接口编程,而不是对实现编程。因为抽象接口是稳定的,多态调用的时候只需要修改或增加新的子类(实现细节)即可,起到了一种松耦合的作用。
-
这样有新的品牌soap的时候只需要扩展即可,不需要对其他的进行修改
2.开放封闭原则
-
对扩展开放,对更改封闭。
-
类模块应该是可扩展的,但是不可修改。
总结:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
3.单一职责原则
通俗来说就是各管各的,当一个类职责变化时不会导致另一个类职责的变化.
优点:可以降低类的复杂度,提高可读性
4.里氏替换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象,且不能改变该地方的功能。
即:只能继承父类的功能而不能改写。
class Base
{
public:
void process()
{
cout<<"base";
}
}
class Derive:public Base
{
public:
void process()
{
cout<<"Derive";
}
.....
}
上述代码就违背了里氏替换原则。
运用里氏代换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。里氏代换原则是开闭原则的具体实现手段之一。
5.接口隔离原则
-
不应该强迫客户程序依赖它们不用的方法。
-
接口应该小而完备
6.迪米特法则
一个对象应该对其他对象保持最少的了解
因为类之间的关系最紧密,耦合度越高,一个类变化时对另一个类的影响也大