设计模式

来源:互联网 发布:js超出两行显示省略号 编辑:程序博客网 时间:2024/05/17 15:03
20120816-责任链模式责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色如下所示:

  ●  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

  ●  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

PS:这种模式个人觉得有个缺点,就是执行路径并不是很宏观。而且每一个节点都要负责路径的转发。个人觉得可以改善为用外部总控执行路径,责任节点采用配置的形式放入总控中。在总控中统一控制路径的中止,跳转等。

20120817-命令模式:
命令模式的结构如图2所示:


                                                  图2  命令模式结构图
Command:
        定义命令的接口,声明执行的方法。
ConcreteCommand:
        命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:
        接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:
        要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client:
        创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
PS:为毛要搞这么复杂呢?难以理解!
20120825---合成模式:

抽象构件角色:这是一个抽象角色,它给参与组合的对象规定一个接口,这个角色给出共有接口及其默认行为。

树叶构件角色:代表参加组合的树叶对象,一个树叶对象没有下级子对象。

树枝构件角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

 其中Composite类型的对象可以包含其它Component类型的对象,换而言之,Composite类型对象可以含有其它的树枝类型或树叶类型的对象。合成模式的实现有安全模式和透明模式。

透明方式

作为第一种选择,在Component里面声明所有的用来管理子类对象的方法,包括add(),remove(),以及getChild()方法。这样做的好处是所有的构件类都有相同的接口,在客户端看来,树叶类对象与合成类对象的区别起码在接口层次上消失了,客户端可以同等的对待所有的对象,这既是透明形式的合成模式。 

这个选择的缺点是不够安全的,因为树叶类对象和合成类对象在本质上是有区别的,树叶类对象不可能有下一个层次的对象,因此add(),remove()以及getChild()方法没有意义,是在编译时期不会出错,而只会在运行时期才会出错。

 安全方式

第二种选择是在Composite类里面声明所有的用来管理子类对象的方法,这样的做法是安全的做法,因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。

PS:典型的合成模式的应用是WINDOWS的文件管理器.还有AWT的图形构件.

0 0
原创粉丝点击