zoukankan      html  css  js  c++  java
  • 设计模式——设计原则

      不管何种设计模式,其实都会遵守一些设计原则,这些设计原则可以理解为面向对象的一些精髓,只有遵守这些设计原则,设计模式才会变得精彩!

      (1)单一职责原则——就一个类而言,应该仅有一个引起它变化的原因。

      初步看来,单一职责的解释有点似懂非懂,类肯定会变化的,那什么是变化,又有什么可以使类发生变化呢。其实可以这么理解:如果一个类承担的责任过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。这么理解看来,单一职责原则其实就是鼓励一个类只完成它的专属责任,它不因该完成多个任务或者代替其他类完成不应该完成的任务。当你有多个动机去想着改变这个类的时候,那么这个类就违背的单一职责原则。 

      单一职责原则的好处是显而易见的,它可以帮我们实现低耦合这一基本原则。当我们需要改变一个功能时,我们只需要去寻找实现该功能的类即可,而不必担心改变该类会引起其他的不可预知的错误。例如策略模式就是一个体现单一责任原则的好例子,每个类都有自己的责任,互不干涉。

      (2)开放-封闭原则——软件实体(类、模块、函数等等)应该可以扩展,但不可修改。

      开放封闭原则其实是面向对象的一种很好的提现,我们在开发中总会遇见需要对代码需要修改的时候,这时候对我们的版本控制是非常不利的,那么我们就需要开放封闭原则了。对扩展开放,对修改关闭。那怎么去实现呢,那就需要用到抽象这一利器了。当预知一个实体可能会出现变化时,我们不能将这个实体写死,需要尽量对这个实体进行抽象,那正确的实现抽象时,当需要对程序进行改动时,就可以写新代码,而不是对老代码进行修改。 

      开放-封闭原则是面向对象设计的核心所在。遵守这个原则可以带来面向对象技术所声称的巨大好处,也就是可我维护,可扩展,可复用,灵活性好。

      当然,我们也不能对所有的实体采取这个原则,开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,比如说简单工厂模式中计算器的运算方法,策略模式中促销打折的方法。这些对象经常发生变化,我们需要采取开放-封闭原则。对新的计算方法采取开发,对原来的计算方法采取封闭。拒绝不成熟的抽象和抽象本身一样重要。

      (3)里氏转换原则——子类必须能够替换掉它们的父类。

      只有当子类可以替换掉父类时,软件单位的功能不受到影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。由于有了里氏转换原则,才使得开放-封闭原则成为可能。

      (4)依赖倒转原则——高层模块不应该依赖底层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

      依赖倒转原则也可以理解成:要针对接口编程,不要针对实现编程。当我们进行编程时,习惯于写一些低层方法。当我们进行高层开发时,可以对这些低层方法进行复用。但是当我们需要对低层需要修改时,就会发现高层与低层的耦合性太高,修改低层的时候,高层也需要很大程度的改动。

      依赖倒转原则是建立在里氏转换原则之上的,高层和低层都应该依赖抽象,而且被抽象的父类可以被各自的子类所替换,这样高层和低层就没有了依赖,除了约定的接口,大家都可以灵活自如的替代自己的当层。所以,面向接口编程的好处就在这里,不必理会另外一层怎么实现,进行什么修改,只要按照接口规定,实现了自己该实现的功能就行了。

      (5)迪米特法则——如果两个类不必彼此通信,那么两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

      迪米特法则的根本思想就是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成影响。每一个类都应该尽量降低成员的访问权限。比如当一个类需要访问另一个类的字段时,被访问的类只需给予访问类一个属性就可以了,而不必让访问类知道这个属性对字段做了什么处理。

      再比如,策略模式中打折促销的方法,不必让表面层知道有这个方法,通过Context里面的方法,可以代为转发这个低层方法的调用,而表面层只要调用Context里面的方法就行。当我么增加低层促销打折的一种新方法,只需要让Context增加一种新对象的创建,而表面层更本就不知道低层方法已经修改过了。

    (注:对此法则的理解可能不太深刻或者存在一些错误的理解,以后当学习了更多的设计模式的时候,再回来进行修改。)

                                                              以上内容部分参考程杰的《大话设计模式》一书

  • 相关阅读:
    EMV/PBOC解析(三) TLV格式解析(C#)
    写自己的WPF样式
    EMV/PBOC 解析(二) 卡片数据读取
    FLEX 图片拷贝
    重学浏览器(2)-进程间的交互
    重学浏览器(1)-多进程多线程的浏览器
    实现财务自由-《富爸爸穷爸爸》读书语句摘抄
    mini-css-extract-plugin简介
    egg.js路由的优雅改造
    node中异步IO的理解
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3091516.html
Copyright © 2011-2022 走看看