引言
在设计模式中有六大基本原则,分别是单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。
在这六大基本原则之上,然后衍生了很多具体的设计模式。本文首先从这六大原则说起,然后再对工作中运用的比较多的几种设计模式进行详述。
单一职责原则
一个类中应该是一组相关性很高的函数、数据的封装。一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
单一职责原则表现出来的是“单一”两字。但如何划分一个类、一个函数的职责,每个人都有自己的看法,这需要根据个人经验、具体的业务逻辑而定。但是,它也有一些基本的指导原则,例如,两个完全不一样的功能就不应该放在一个类中。一个类中应该的一组相关性很高的函数、数据的封装。
开闭原则
开闭原则的定义是:软件中的对象(类、模块函数等)应该对于扩展是开放的,但是对于修改是封闭的。
当软件需要变化时,我们应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。
里氏替换原则
里氏替换原则:所有引用基类的地方必须透明地使用其子类对象。简单的来说就是,所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常。
里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性。
开闭原则和里氏替换原则往往是生死相依、不弃不离的,通过里氏替换原则来达到对扩展开发,对修改关闭的效果。然而,这两个原则都同时强调了一个OOP的重要特性——抽象,因此,在开发过程中运用抽象是走向代码优化的重要一步。
依赖倒置原则
依赖倒置原则指代了一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了。
这里有几个重要的关键点:
1、高层模块不应该依赖低层模块,两者都应该依赖其抽象;
2、抽象不应该依赖细节;
3、细节应该依赖抽象。
在Java中,抽象就是指接口或者抽象类,两者都是不能被直接实例化的;细节就是实现类,实现接口或者继承抽象类而产生的类就是细节,其特点是,可以被实例化,也就是可以加上一个关键字new产生一个对象。
依赖倒置原则在Java语言中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。也就是说面向接口编程,或者说面向抽象编程,这里的抽象指的是接口或者抽象类。
接口隔离原则
接口隔离原则的定义是:客户端不应该依赖它不需要的接口。另一种定义是:类间的依赖关系应该建立在最小的接口上。接口隔离原则将非常庞大、臃肿的接口拆分成更小的和更具体的接口,这样客户将会只需要知道他们感兴趣的方法。接口隔离原则的目的是系统解开耦合,从而容易重构、更改和重新部署。
迪米特原则
迪米特原则也称为最少知识原则,一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或者调用的类知道得最少,类的内部如何实现与调用者或者依赖者没有关系,调用者或者依赖者只需要知道它需要的方法即可,其他的一概不用管。
单例模式
单例模式是最简单的设计模式,也是最常用到的设计模式。单例模式的定义是:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
使用单例模式的场景是:这个类需要经常被使用到,并且创建对象时需要占用挺大的内存或者说耗费比较多的资源,我们就可以通过创建一个单例类。
例如在工作中很多管理类都是叫做xxxManager,通常会把它定义为一个单例类,然后这些管理类的对象只需创建一次,然后处处都可以使用。
建造者模式
建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在Android中,我们创建一个AlertDialog时用的就是建造者模式:
new AlertDialog
.Builder(this)
.setTitle("title")
.setMessage("message")
.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//...
}
})
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//....
}
})
.create()
.show();
建造者模式的使用场景是:
我们需要创建一个复杂对象,该复杂对象通常是由多个子对象组成的,但是由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
拿上面的AlertDialog来说,它的基本构成是复杂的(有标题,内容,按钮及其对应的事件等等属性),但是在实际需求中,不同的界面,我们需要展示给用户的Dialog是不一样的(标题不一样,内容不一样,点击事件也不一样),这些各个部分都是在不断剧烈的变化,但是他们组合起来是相对稳定的(就是一个Dialog弹出展示在界面上)。
参考文章
1、如何通俗理解设计模式及其思想?
2、Android源码设计模式解析与实战