you are better than you think

《设计模式》笔记

· by thur · Read in about 1 min · (86 Words)
设计模式 笔记

看了《敏捷软件开发(原则模式与实践)》,感受Java的设计原则和模式真的很棒,看了这本书收获很多。关于设计原则/模式的笔记记录如下。  

一 设计的臭味

1 僵化性

难以对软件进行改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。

2 脆弱性

进行一个改动时,程序的许多地方就可能出现问题。

3 牢固性

设计中包含有对其他系统有用的部分,但把这些部分从系统中分离出来所需要的努力和风险是巨大的。

4 粘滞性

软件的粘滞性 与环境的粘滞性(耦合关系很重的一些指标, 绝对路径,绝对依赖等)。

5 不必要的复杂性

涉及中包含当前没有用的部分,它就含有不必要的复杂性(过度设想和设计未来可能使用的接口)。

6 不必要的重复

当同样的代码,以稍微不同的形式一再出现时,就表示开发人员忽视了抽象。

7 晦涩性

模块难以理解

二 设计原则

设计原则主要是用来避免以上问题的一些策略或技巧。

1 SRP(Single ResPonsibility Principle):单一设计原则

就一个类而言,应该有且仅有一个引起他变化的原因。

职责:变化的原因。 如果能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。

2 OCP(The Open-Closed Principle):开放封闭原则

软件实体(类/模块/函数等)应该是可以扩展的,但是应该是不可修改的。对扩展开放而对修改封闭。关键就是用好抽象和多态。

获取封闭性的方法

a. 使用抽象获取显式封闭(封闭是建立在抽象基础上的,过程化的解决方案违反OCP) b. 使用数据驱动的方法获取封闭性

3 LSP(Liskov Substitution Principle)Liskov 替换原则

子类型subtype必须能够替换掉它们的基类型base type。如果新派生类的创建会导致改变基类,这就常常意味着设计是有缺陷的。

继承是IS-A(“是一个”)关系,即如果一个新类型的对象被认为和一个已有类型的对象之间满足IS-A关系,那么这个新对象的类应该从这个已有对象的类派生。OOD(面向对象开发)中IS-A是就行为方式而言的,行为方式是可以进行合理假设的。

DBC(Designed By Contract)基于契约设计 。 契约是通过为每个方法声明的前置条件和后置条件来指定的, 要使一个方法得以执行,前置条件必须为真,执行完毕后该方法要保证后置条件为真。

子类方法的前置条件<= 基类方法的前置条件

子类方法的后置条件>=基类方法后置条件

如果一组类都支持一个公共的职责,那么他们应该从一个公共职责的超类来继承该职责。违反LSP原则的表现:

  1. 派生类中函数退化
  2. 派生类中添加了基类不会抛出的异常

4 DIP(Dependence Inversion Principle)依赖倒置原则

  1. 高层模块不应该依赖于底层模块,二者应该依赖于抽象。
  2. 抽象不应依赖于细节,细节应该依赖于抽象。

高层调用一个声明的接口(抽象),底层模块实现接口。

找出潜在的抽象,高层应用策略:应用背后的抽象,是那些不随具体细节改变而改变的真理。

如何实现倒置?

  1. 倒置接口 所有权:低层模块实现高层模块中声明并被高层模块调用的接口
  2. 依赖抽象:程序中所有依赖关系都应该终止于抽象类或接口

5 ISP(Interface Segregation Principle)接口隔离原则

不应该强迫客户依赖于他们不用的方法,这个原则用来处理“胖”接口所具有的缺点。“胖”接口可以分解成多组方法,每一类方法都服务于不同的客户程序,根据客户所调用的方法对客户进行分组,而不是为每个客户创建分离的接口。

分离接口的方法

  1. 使用委托分离接口;
  2. 使用多重继承分离接口;

Comments