设计模式最主要的目的就是解耦,低耦合,高内聚,扩展性,重用性,灵活性,这些都是设计模式努力的方向。
- 重用性:相同功能的代码,可以复用
- 可读性:代码结构清晰简洁,编程规范,便于其他程序员阅读与理解
- 可扩展性:当需要增加新的功能的时候,非常方便
- 可靠性:增加新功能后,对原来功能没有影响
当然不是随随便便的模式都可以成为设计模式,设计模式也要遵守一定的设计原则。
单一职责模式
顾名思义,一个类应该只负责一项职责
作用:降低类复杂度,一个类只负责一项职责,提高类的可读性和维护性
接口隔离原则
客户端不应该依赖于它不需要的接口,一个类对另一类的依赖应该建立在最小的接口上,这样讲可能还是有点抽象,看下下面的伪代码理解下:
Interface A{
Method a;
Method b;
Method c;
}
//假设现在有个实现类B,B只需要Method A和Method B方法,那么如果B实现了A,
//那么B就需要多实现一个Method c方法,而对于这个方法C,B并不需要。所以对于B来说,
//A并不是最小接口
class B implements A{
//实现方法a
//实现方法b
//实现方法c
}
解决上述的问题就是把接口A,拆分为更小的接口
依赖倒转原则
1、高层模块不依赖于底层模块,二者应依赖于其抽象
2、抽象不应该依赖细节,细节应该依赖于抽象
3、其核心思想就是面向接口编程
4、对比细节实现的多变性,使用抽象比较稳定
5、使用接口和抽象就相当于制定好规范,然后让实现类根据规范去填充细节部分。
class QQ{
}
class QQ implements Tool{
}
class WeiChat implements Tool{
}
class People{
public void get(QQ q){//这样写就相当于写死了,
//后续如果要增加微信其他的,就需要直接修改这部分代码,所以不可取
}
public void get(Tool t){//应采取这种方法
}
}
里氏替换原则
此原则通俗来讲就是不要去重写父类中已经实现的方法,一但修改容易对整个继承体系造成破坏,举个例子:
class A{
public void a(){
System.out.println("a");
}
}
class B extends A{
public void a(){//重写了父类中的a方法
System.out.println("b");
}
}
class C extends B{
public void b(){
a();//调用了a方法,C想要调用的是A中的a方法,
//可是却不知道B对a方法进行了重写,所以这里就出现了问题
}
}
建议:通过聚合,组合,依赖等来解决问题
开闭原则(OCP)
这个原则是最基础,也是最重要的原则。从字面上了解到意思就是对扩展开放,对修改关闭。
利用抽象来构建框架,使用实现来扩展细节。
当一个软件需要扩展功能的时候,我们不应该去修改原来已经有的功能代码。
迪米特原则
一个对象应该对其他的对象保持最少的了解,类与类直接关系或者了解越密切,其耦合性就越高。
这个原则又称最少知道原则,一个类应该对自己所依赖的类知道得越少越好。
迪米特原则,一个最简单的理解就是要与直接的朋友进行通信,何为直接朋友呢?
直接朋友:出现在成员变量、方法参数、方法返回值的类就是直接朋友,而在局部变量中出现的类就不是直接朋友,也就是说陌生类不要以局部变量的形式出现在类的内部。
合成复用原则
写代码的时候应尽量使用合成聚合的方式,而不是继承的方式,继承其实就是加大了类与类之间的耦合性
总结一下:
设计原则的核心:
1、将稳定的代码和变化的代码分离出来
2、面向接口编程
3、低耦合,高内聚