设计模式前奏

  何为设计模式?

   在学习java之初,就听到了设计模式的顶顶大名了,第一门设计模式的入门的书是《大话设计模式》,当时最有印象的就是活字印刷术了,“喝酒唱歌,人生真爽”=》“对酒当歌,人生几何”。由这个例子而引出的面向对象,当时对于面向对象只是处于清楚概念,只是知道是怎么回事,却不知所以然。即使反复阅读此书,仍然觉得不得要领,而随着工作经验的增长,也越发觉得设计模式的重要,以至于本人也在不断的回顾设计模式,来应付开发中不断变化的需求,也对面向对象有了一个更深对理解,但却仍不敢说掌握了所有的设计模式,而本系列的博客也是我对个人学习设计模式过程的一个总结。设计模式所体现的即是如何用抽象的思想来应对软件的复杂需求和变化,变化既定为我们软件开放不可避免的的事实,那我们何不在设计时尽量适应这些变化,以提高项目的稳定性和灵活性,真正的实现“拥抱变化”。

   设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

  上面这一段话是我摘自于《菜鸟教程》 的一段话,我们为何要学习设计模式?其实最后一句话已经告诉了我们答案:

  1. 重用代码:软件质量并不是依靠代码行数来评定的,我们更注重的是面向对象的特性之一,即封装。我们对一些特定功能模块对封装,就是为了重用代码。
  2. 代码更容易被他人理解:既定设计模式是被多数人知晓对,那我们遵循某些设计原则开发的代码,相比较那些逻辑混乱的代码,应该是更容易被人理解的。
  3. 代码可靠性:我们可以理解的是,代码越多,意味着系统的复杂性越高。有的代码只是考虑功能的实现,而没有考虑到功能的对接和扩展,那么当需要对功能实现扩展时,就发现难以下手,甚至需要改动曾经的稳定代码,这些都是原来代码过于僵化的表现。

  软件设计的七大原则:

   1、单一职责原则:

   单一职责原则(Simple Responsiility Principle,SRP),指不要存在一个以上导致类变更的原因。如果一个类负责两个职责,一旦需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的类的功能发生故障。遵守单一职责原则,对于多个功能职责的业务,我们可以拆分成多个类完成业务逻辑来进行结偶,这样可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。一句话概括:专人干专事,一个类干一件事。

   2、开闭原则:

     开闭原则(Open-Closed Principle,OCP),指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用《大话设计模式》中对一句话概括:用抽象构建框架,用细节实现扩展。开闭原则是面向对象设计中最基础对设计原则,它指导我们如何建立稳定灵活对系统,减少维护变更带来的新风险。一句话概括:对扩展开放,对修改关闭。

       3、依赖倒置原则:

   依赖倒置原则(Dependence Inversion Principle,DIP),指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象,通过依赖倒置原则,可以降低类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并降低修改程序带来的风险。一句话概括:高层不应该依赖于底层。

     4、接口隔离原则:

   接口隔离原则(Interface Segregation Principle,ISP),指用多个专门的接口,而不是使用单一的总接口。这个原则主要是指导我们设计接口的,一个接口尽量只干一件事情,当然如果一个接口如果只写一个方法的时候,是最隔离的。而这也是最具争议的地方,如何做到接口的合理设计,是我们要多花时间思考的地方,我们需要多考虑业务模型,包括还要对以后可能发生变更的地方做一些预判。接口隔离原则符合“高内聚,低耦合”的设计思想,使得类具有很好的可读性、可扩展性和可维护性。一句话概括:一个接口只干一件事情。

   5、迪米特法则:

    迪米特法则,又称最少知道原则(Demeter Principle),指一个对象应该对其他对象保持最少对了解,尽量降低类与类之间的耦合。迪米特法则还有一个英文解释是:Only talk to your immedate friends(只与直接的朋友通信)。一句话概括:不需要知道的就不要知道。

   6、里氏替换原则:

    里氏代换原则(Liskov Substitution Principle,LSP)是面向对象设计的基本原则之一。 里氏代换原则中说,任何父类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉父类,且软件单位的功能不受到影响时,父类才能真正被复用,而派生类也能够在父类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。一句话概括:子类重写方法功能发生改变,不应该影响父类方法的含义。

   7、合成复用原则:

    合成复用原则(Composite/Aggregate Reuse Principle,CARP),指尽量使用对象组合或对象聚合的方式实现代码复用,而不是用继承关系达到代码复用的目的。合成复用可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小。继承,又被成为白箱复用,相当于把所有的实现细节暴露给子类,而组合又被成为黑箱复用,对类以外的对象是无法获取实现细节的。一句话概括:尽量使用合成/聚合的方式,而不是使用继承。

  23种设计模式

   Gof共列举了23种设计模式。23种设计模式共可以分为三类,分别是:

  1. 创建型设计模式,这类设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式而不是直接使用new来进行对象的创建。这其中包括----工厂方法模式、抽象工厂模式、单利模式、原型模式、建造者模式。
  2. 结构性模式,这类设计模式关注类和对象的组合,继承的概念被用来组合接口和定义组合对象获得新功能的方式。这其中包括----代理模式、门面模式、装饰器模式、享元模式、组合模式、适配器模式、桥接模式。
  3. 行为性模式,这类设计模式关注对象之间的通信。这其中包括----模板方法模式、策略模式、责任链模式、迭代器模式、命令模式、状态模式、备忘录模式、中介者模式、解释器模式、观察者模式、访问者模式。  

 

   

 

posted @ 2020-12-27 19:37  梦里藏梦、  阅读(87)  评论(0)    收藏  举报