前言
在项目实践的具体代码设计中,我们不仅需要考虑功能模块的设计与实现,还需要考虑项目功能上线后的后续维护和功能的修改。在长期编写代码的过程中,程序员们总结出一定的经验,即设计模式。这次先介绍设计模式一般需要遵守的几个基本原则,这也是我们在具体项目代码设计中需要考虑到的基本问题。
开闭原则
对于功能的增加应该是通过扩充代码而不是修改代码。简单来说,我们添加一个功能应该尽量避免修改原来的代码,因如果我们在增加功能的时候大幅修改已有的代码,可能导致新的功能实现了,但原有功能出现了bug。为了避免这种情况出现,我们应该增加新功能的时候,设计或者编写代码的时候,应该尽量避免改动原有的代码。
int add(int x,int y)
{
int res=x+y;
return res;
}
//就比如,我们现在实现了add函数来实现计算加法的功能,我们现在想要实现计算的结果再增加1,这里有下列两种方法修改
//1
int add(int x,int y)
{
int res=x+y+1;
return res;
}
//2
int add(int x,int y)
{
int res=x+y;
res+=1;
return res;
}
//方法2的方式是更符合开闭原则的。
依赖倒转原则
常规的类设计是高层依赖于底层,抽象层依赖于具体的实现
class A{
public:
void printA();
void printB();
void printC();
};
void doPrintA(A* a){
a->printA();
}
void doPrintB(A* a){
a->printB();
}
void doPrintC(A* a){
a->printC();
}//就如同上面的实现打印A,B,C这三个功能关系是
// A
// printA printB printC
//doPrintA doPrintB doPrintC
//是从高到低的依赖,这样耦合度过高,我们不想打印A想打印D,需要修改printA,还要相应的修改doPrintA
而依赖倒转原则其实就是我们告诉我们需要灵活地运用多态特性来减少改动。
class Print{
virtual doPrint()=0;
}
class APrint{
virtual doPrint(){/*实现打印A*/};
}
class BPrint{
virtual doPrint(){/*实现打印B*/};
}
class CPrint{
virtual doPrint(){/*实现打印C*/};
}
//通过多态,我们只需要实例化一个基类就可以实现打印A,B,C
Print* p=new APrint;//打印A
Print* p=new BPrint;//打印B
Print* p=new CPrint;//打印C
p->doPrint();
这时候,如果我们需要将打印A换成打印D,只需要修改APrint类中的doPrint函数,其他都不需要修改,极大减少了需要改动的地方,这就是遵守依赖倒转原则带来的好处。