【HeadFirst 设计模式学习笔记】14 责任链模式拾零

简介:

Head First里面没有详细说这个设计模式,可能是觉得这个设计模式和观察者模式有很大的相似度,事实也正是如此。正如观察者模式一样,也有一个subject表示一个事件的发生,而向后传递的不再是一个或多个并行的观察者,而是一个或多个串行Object(可以理解为处理者,只是名字不同而已)。

6.rm_20110404_153214

我们下边举个实例,在这个例子中,有一个获取帮助的事件发生,根据帮助的种类不同,我们有三层对这个事件进行响应,分别是FrontEnd 、IntermediateLayer 、Application :

首先我们要定义一个统一的获取帮助的接口:

interface HelpInterface{

     public void getHelp(int helpConstant);

}

然后我们再定义三个帮助类型:

  1: class HelpType {
  2:   public final static int FRONT_END_HELP = 1;
  3:   public final static int INTERMEDIATE_LAYER_HELP = 2;
  4:   public final static int GENERAL_HELP = 3;
  5: }
  6: 

现在我们就可以定义处理逻辑了:

首先我们定义第一层FrontEnd:

  1: class FrontEnd implements HelpInterface {
  2:   HelpInterface successor;
  3: 
  4:   public FrontEnd(HelpInterface s) {
  5:     successor = s;
  6:   }
  7: 
  8:   public void getHelp(int helpConstant) {
  9:     if (helpConstant != HelpType.FRONT_END_HELP) {
 10:       successor.getHelp(helpConstant);
 11:     } else {
 12:       System.out.println("front end");
 13:     }
 14:   }
 15: }

它实现了HelpInterface接口,并且在初始化时定义了如果它无法处理时谁会随后接着处理(successor),在实现getHelp时判断帮助类型,若不是FrontEnd处理的则调用后继的getHelp,并把帮助类型传入,若是则进行处理(此处打印就表示为处理)。

然后我们定义第二层 IntermediateLayer ,思路也是一样的:

  1: class IntermediateLayer implements HelpInterface {
  2:   HelpInterface successor;
  3: 
  4:   public IntermediateLayer(HelpInterface s) {
  5:     successor = s;
  6:   }
  7: 
  8:   public void getHelp(int helpConstant) {
  9:     if (helpConstant != HelpType.INTERMEDIATE_LAYER_HELP) {
 10:       successor.getHelp(helpConstant);
 11:     } else {
 12:       System.out.println("intermediate");
 13:     }
 14:   }
 15: }

最后我们定义最后一层Application :

  1: class Application implements HelpInterface {
  2:   HelpInterface successor;
  3: 
  4:   public Application(){
  5: 
  6:   }
  7: 
  8:   public Application(HelpInterface s){
  9:     successor = s;
 10:   }
 11: 
 12:   public void getHelp(int helpConstant) {
 13:     System.out.println("application");
 14:   }
 15: }

此处加入了一个空构造函数,表示此层可以为最后一层,不需要successor,当然可以删除设置successor的构造函数,此处是为了以后增加层数时而保留的接口。

于是我们就可以写一个程序测试一下了,从后往前创建处理层,并且分别指明后继:

  1: public class MainClass {
  2:   public static void main(String args[]) {
  3: 
  4:     Application app = new Application();
  5: 
  6:     IntermediateLayer intermediateLayer = new IntermediateLayer(app);
  7: 
  8:     FrontEnd frontEnd = new FrontEnd(intermediateLayer);
  9: 
 10:     frontEnd.getHelp(HelpType.GENERAL_HELP);
 11:   }
 12: }
 13: 

结果是Application这层进行了处理。




本文转自gnuhpc博客园博客,原文链接http://www.cnblogs.com/gnuhpc/archive/2012/12/21/2827621.html,如需转载请自行联系原作者

相关文章
|
23天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
41 3
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
55 9
|
14天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
24 0
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
29 2
|
1月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
37 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
16 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
39 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
44 0
|
2月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
27 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
27 0