这几天论文写完了,开始收拾起本该寒假就读完的《大话设计模式》。整本书读起来仍是不错的,语言诙谐有趣,以生活中的例子为切入点,使读者容易理解。比较适合面向对象语言的初学者或者中级人员学习。在这个系列学习中,咱们先从设计模式的四大原则开始学起数据库
* 单一职责:就一个类而言,应该仅有一个引发它变化的缘由。 * 开闭原则:软件实体(类,方法。。)应该能够扩展,可是不能修改。 * 依赖倒置:抽象不该该依赖于细节,细节应该依赖于抽象。 * 里式替换:子类型必须可以替换掉他们的父类型。
以开发一个俄罗斯方块为例。咱们能够把方块的下落,旋转,移动,碰撞判断等逻辑和游戏页面分离开来,也能够写在一块儿。可是界面的变化和游戏自己的逻辑之间是没有关系的。
其实软件设计的主要内容就是发现职责并把这些职责分离开来。若是咱们能想到有多于一个动机去改变一个类,那么这个类就具备多于一个职责。咱们就要想办法将类的职责进行分离。
由于若是一个类的职责过多,就等于把这些职责耦合在一块儿了,一个职责的变化可能会削弱或者抑制这个类完成其余职责的能力,使整个设计变得脆弱。编程
开闭原则从字面意思来解释即对扩展开放,对修改封闭。
整个开闭原则所要描述的问题是怎样的设计可使咱们的系统在面对忽然变化的需求时,能够尽可能少的修改便可知足需求。
以上班考勤为例。针对上班的8小时工做制,有的公司规定早9晚6,有的公司则规定早8晚5。全部的规定都是面向8小时封闭,面向起始时间开放的。甚至对以业绩为指标的公司,能够对8小时工做制都开放,可是对员工的业绩必须封闭。这里就须要找清本身想要达到什么目的。
固然,在咱们写代码的时候,咱们假设变化不会发生,可是当变化发生时,咱们就应该建立抽象类来隔离之后发生的同类变化。好比须要建立一个加法运算。咱们能够建立一个Client类来进行执行。一个加法类来进行加法运算。可是当咱们须要在Client中支持减法的时候,咱们就应该考虑抽象出一个运算类来进行实际的运算操做和Client的隔离。同时若是咱们须要增长乘法,除法类的时候,只需新增长类便可,不准要在修改Client了。这样能够达到对扩展开放,对修改封闭的目的。设计模式
其实整个依赖倒置原则的通俗的将就是应该面向切口编程。
这里书中对倒置的解释引用了数据库链接中高层模块依赖与底层模块的例子。可是我以为直接看主板和内存,CPU等的关系更容易理解。即若是内存,CPU等坏了,咱们直接换掉了就能够了。可是若是做为底层模块的主板坏了,咱们是否是得把整个电脑换了才能够呢?答案是固然不用。由于主板和内存都是面向接口的,因此咱们只要换掉主板就能够了。至于为何在类的设计中,咱们针对接口编程就能够完成依赖倒置呢?是由于接口的设计须要符合里式替换原则。学习
里式替换即一个软件里面若是把父类都替换成了子类,则它的行为是没有变化的。
好比在设计一个Bird(鸟)类时具备能够飞的属性。同时设计一个Penguin(企鹅)类不能够飞。那么Penguin类能够继承Bird类吗?答案固然是否认的。(由于不符合里式替换的子类能够替换掉父类的原则。)
正是因为子类可替换父类,父类才能够被复用,而子类也能够在父类的基础上增长行为。同时正是由于子类可替换父类,才使得使用了父类的模块在不须要修改的状况下就能够扩展,使开闭原则成为可能。ui
若是编写程序时考虑的都是依赖抽象编程而不是依赖细节编程,即编写程序的依赖关系都终止于抽象类或者接口则是面向对象的设计了。spa