Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356905
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类: 项目管理

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的输入输出流

FileInputStreamStringBufferStreamByteArrayStreamFilterInputStreamInputStreamObjectInputStream,可以这样调用:

New(Func1(New Func2(New Func3(New First())))).Method();

这样系统将依次调用Func1Func2Func3FirstMethod方法;Func1-3First都继承自同一个装饰类A,在类A中有一个A类型的成员;

3.7 Singleton模式

   这个模式比较简单,就是保证每个类只能实例化一次,将构造函数私有化,同时声明一个静态函数GetInstance来返回类实例;单线程比较容易控制,在多线程中,需要使用同步方法进行控制,

   所谓的Double-Checked Locking模式就是在多线程模式下,利用同步方法保证不会发生异常,Java中使用Synchronized关键字来维护;

3.8 Observer模式

  这是一个比较有趣的模式,一个比较容易理解的例子就是IDS中的方法链,比如要对一个数据包进行检测处理,那么就要调用相应的方法链上的所有方法来处理该数据包;

适用于抽象对象Object发生变化时需要通知所有的观察者,而抽象对象Object又不完全知道所有的观察者,解决办法:每个观察者在实例化的时候自动注册到Object中,在Ojbect中有几个方法,attachObjectDettachObject,每个观察者都有一个Update方法,当发生变化的时候Object调用Notify方法通知观察者链中的所有观察者进行Update

3.9Template Method 模式

  这个是概念意义上的说法(个人认为)

  就是将一组功能上耦合紧密的步骤放到抽象类中,但是某些步骤是可以变化的,从用户角度看不到变化,这就需要将变化封装到子类中具体实现;

3.10 Factory Method模式

  上面Template Method模式中将变化封装到子类中就应用了Factory Method模式,比如某步骤是GetObject,子类实现为A.GetObjectB.GetObject,实现了方法覆盖;

3.11 分析矩阵

  分析矩阵从全局着手,一步步抽象中通用的数据和行为(列),行则是对这些数据和行为的实现方法;

设计模式并不仅限于以上几种,还有其他好多种模式,需要在具体的项目设计中去运用、领会,虽然都说设计模式并不限于面向对象编程,但是个人看来设计模式对于面向对象编程带来的便利要大的多。

阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~