分类: 项目管理
2014-07-01 23:48:09
--------------作者:阿兰、夏洛威和詹姆斯、托特 熊节译
1、 有关面向对象编程的新解释
ü 对象是具有一定责任的事物,对象对自己负责;
ü 面向对象编程最重要的特性是封装而不是继承;封装意味着任何形式的隐藏,包括数据、类、实现隐藏;
ü 使用接口进行设计;
ü 将变化封装在一个类中,并使之与该类中其他变化点分离;
ü 将继承考虑为一种封装变化的方法,而不是为现有对象制造特殊情况;
ü 尽量使用对象内聚而不是继承;
ü 力求高内聚,松耦合;【找准对象之间的关联】
ü 使用变化点/共同点分析抽象出行为和数据的变化点;
ü 一次且只有一次原则:对于某种行为,只定义一次;
2、 设计模式
所谓模式就是在特定场景下对特定问题的解决方案;可以从概念、规格、实现三个不同的视角来分析共同点/变化点;
好的设计能够包容未来的变化,而不用改变现有的代码,换句话说,模块、方法和类对扩展是开放的,对更改则是封闭的。
设计一个系统的时候,最忌早早投入细节,要从整体上把握架构,最常用的就是使用功能划分,由一个个部分构成整体,但是这样划分有可能造成遗漏,从设计模式的角度来看,按责任来划分要更清晰些。
3、 几种设计模式
3.1 Facade模式(外观模式)
这是为了使用现有的系统功能,定义一个比较简洁的接口来封装原来的系统功能,用户不必关系原来系统的细节;
3.2 Adapter模式
这是为了使用现有的模块,将该模块适配为特定的接口以便和其他模块拥有统一的接口,用户感觉不到模块的细节差异;
3.3 Bridge模式
抽象部分和实现部分都有变化,如果使用继承来实现,那么将会造成类爆炸(随着变化增多,类会越来越多),该模式使用类组合,在抽象部分添加一个类引用,引用的类在实现部分再封装变化,说明:抽象部分和实现部分指的不是同一个类,比如用程序画图,抽象部分是图形对象(可能是圆、矩形等),实现部分指的是画图程序(线、矩形等);
3.4 Abstract Factory模式
将某个族的对象的实例化部分封装到一个抽象类中,如
Class Factory{
GetClass A(){}
GetClassB (){}
.
.
.
}
3.5 Strategy模式
将抽象类中变化的策略部分用类封装起来作为成员对象,再由其他类来继承该类,实现不同的策略;
3.6 Decorator模式
该模式适合于在现有的功能至上添加新的功能,而且添加的新功能的执行次序任何组合,具体来说就是由初始调用形成一个对象链,一次执行该对象链上的所有对象的同一个方法,对象链上的对象都继承自同一个基类,构造函数需要传入基类对象以便构造链,最后执行的对象是最初的那个。一个典型的例子就是Java的输入输出流
FileInputStream、StringBufferStream、ByteArrayStream、FilterInputStream、InputStream、ObjectInputStream,可以这样调用:
(New(Func1(New Func2(New Func3(New First()))))).Method();
这样系统将依次调用Func1、Func2、Func3和First的Method方法;Func1-3和First都继承自同一个装饰类A,在类A中有一个A类型的成员;
3.7 Singleton模式
这个模式比较简单,就是保证每个类只能实例化一次,将构造函数私有化,同时声明一个静态函数GetInstance来返回类实例;单线程比较容易控制,在多线程中,需要使用同步方法进行控制,
所谓的Double-Checked Locking模式就是在多线程模式下,利用同步方法保证不会发生异常,Java中使用Synchronized关键字来维护;
3.8 Observer模式
这是一个比较有趣的模式,一个比较容易理解的例子就是IDS中的方法链,比如要对一个数据包进行检测处理,那么就要调用相应的方法链上的所有方法来处理该数据包;
适用于抽象对象Object发生变化时需要通知所有的观察者,而抽象对象Object又不完全知道所有的观察者,解决办法:每个观察者在实例化的时候自动注册到Object中,在Ojbect中有几个方法,attachObject、DettachObject,每个观察者都有一个Update方法,当发生变化的时候Object调用Notify方法通知观察者链中的所有观察者进行Update;
3.9Template Method 模式
这个是概念意义上的说法(个人认为)
就是将一组功能上耦合紧密的步骤放到抽象类中,但是某些步骤是可以变化的,从用户角度看不到变化,这就需要将变化封装到子类中具体实现;
3.10 Factory Method模式
上面Template Method模式中将变化封装到子类中就应用了Factory Method模式,比如某步骤是GetObject,子类实现为A.GetObject和B.GetObject,实现了方法覆盖;
3.11 分析矩阵
分析矩阵从全局着手,一步步抽象中通用的数据和行为(列),行则是对这些数据和行为的实现方法;
设计模式并不仅限于以上几种,还有其他好多种模式,需要在具体的项目设计中去运用、领会,虽然都说设计模式并不限于面向对象编程,但是个人看来设计模式对于面向对象编程带来的便利要大的多。