5分钟学会java设计模式及设计原则

                                                 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 ~ ~ ~写到这里,就写完了,如果有幸帮助到你,请记得关注我,共同一起见证我们的成长

发布了74 篇原创文章 · 获赞 253 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_42175986/article/details/105507722