java设计模式及设计原则
一、前言
时间飞逝,一晃三个月未执笔了;突然明白不写博客的自己,学习也懈怠了。...
步入正题,从今天开始以及在接下来的日子里,我会将 java23种常见模式以及七大设计原则进行学习总结;
设计模式是一门艺术,设计模式来源于生活。本篇博文为起始篇,记录一些概念知识以及个人理解。
后续博文会为每一个常用的设计模式进行详解以及代码实现。
在此记录下,分享给大家。
二、GOF 23种常用设计模式
设计模式是一门艺术,设计模式来源于生活。
下图罗列出 java中23种常用的设计模式。单独每个设计模式详解会在后续博文中更新...
名词解释:
GOF是设计模式的经典名著Design Patterns: Elements of Reusable Object-Oriented Software
(中译本名为《设计模式——可复用面向对象软件的基础》)的四位作者,他们分为是:Elich Gamma、Richard Helm、
Ralph Johnson、以及John Vlissides。这四个人常被称为Gang of Four, 即四人组,简称 GOF
三、七大设计原则
1、开闭原则 <OCP>
一、定义
指一个软件实体(类、函数、模块等)应该对外扩展开放,对内修改关闭,即在扩展某类的功能时应该通过添加新的代码来实现
而不是修改其内部的代码。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。
eg:我们版本更新,我尽可能不修改源代码,但是可以增加新功能。
二、优点
1、对类的功能扩展变得灵活。
2、扩展变得灵活的话,维护性自然就提高了。
2、依赖倒置原则 <DIP>
一、定义
是指程序要依赖于抽象接口,不要依赖于具体实现。
or 指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。
简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合,提高系统的稳定性。
二、优点
1、减少类之间的耦合。
2、低耦合使得代码更容易进行维护和扩展。
3、单一职责原则 <SRP>
一、定义
是指一个类,应该只存在一个引起它变更的原因。通俗的讲就是一个类应该只负责一个职责,如果这个类需要修改的话,也只是因为这个职责的变化了才引发类的修改。
如一个类存在多个引起其变更的原因,我们可以将这多个职责分别用多个 Class 来实现, 进行解耦。
总体来说就是一个 Class/Interface/Method 只负责一项职责。
二、优点
1、降低了类的复杂性。
2、提高类的可读性,提高系统的可维护性。
3、降低变更引起的风险(降低对其他功能的影响)。
4、接口隔离原则 <ISP>
一、定义
是指客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。
接口隔离原则和单一职责原则很像。单一职责是从对象的职责上面去限定,而接口隔离原则希望每个接口都是最小的接口,
接口小的话才使得复用接口变得更加容易。
这个原则指导我们在设计接口时,应当注意一下几点:
1、一个类对一类的依赖应该建立在最小的接口之上。
2、建立单一接口,不要建立庞大臃肿的接口。
3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。
二、优点
1、避免大接口被许多子类实现,造成耦合。降低了耦合,代码也变得好维护。
2、小接口可以赋予特定的含义,使得代码更好理解(例如Comparable接口和Serialization接口一目了然。
3、减少没必要实现的冗余代码。
5、迪米特原则 <LOD>
一、定义
又叫最少知道原则(Least Knowledge Principle,LKP)
是指一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。也就是说类应该尽可能地少的了解其他对象的细节。
如果对象A知道对象B的所有细节,那么对象A就可能会去使用到这些细节。如果你修改了其中对象B中的细节,就会不经意影响到A.
二、优点
1、降低了类之间的耦合。
2、提高了可维护性。
3、减少了代码的可维护性。
6、里氏替换原则 <LSP>
一、定义
是指如果对每一个类型为 T1 的对 象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,
程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义看上去还是比较抽象,我们重新理解一下,可以理解为一个软件实体如果适用一个父类的话,那一定是适用于其子类,
所有引用父类的地方必须能透明地使用其子类的对 象,子类对象能够替换父类对象,而程序逻辑不变。
根据这个理解,我们总结一下: 引申含义:子类可以扩展父类的功能,但不能改变父类原有的功能。
1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2、子类中可以增加自己特有的方法。
3、当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类 方法的输入参数更宽松。
4、当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即 方法的输出/返回值)要比父类更严格或相等。
个人理解:里氏替换原则是用来检验继承是否合理的原则。
二、优点
1、规范了父类与子类之间安全的继承,继承是安全的,代码的复用才是安全的。
2、继承也提高了代码可维护性,方便修改父类的公共方法和子类的特定方法。
7、合成复用原则 <CARP>
一、定义
是指尽量使用对象组 合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的。
可以使系统更加灵 活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。
-- 尽量使用组合和聚合,尽量少使用继承。为什么呢?继承不是面向对象的良好特性吗?
-- 继承有很多局限性。首先,继承属于一种硬编码。如果没有遵守里氏替换原则,父类一旦修改,所有子类都需要进行改变。
-- 继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱 复用,对类以外的对象是无法获取到实现细节的。
-- 要根据具体的业务场景来做代码设计, 其实也都需要遵循 OOP 模型。
二、优点
1、修改各个复用到的类变得容易,不用担心会影响到其子类。
2、可以动态的替换各个复用类。
3、各个复用类各司其职,在其他地方一样也可以使用,提高了代码复用。
Now ~ ~ ~写到这里,就写完了,如果有幸帮助到你,请记得关注我,共同一起见证我们的成长。