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


    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    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这层进行了处理。

     

    在线视频:http://v.youku.com/v_show/id_XMjU2MTI1MDY4.html

     

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    Linux下的输入/输出重定向
    strcpy与strncpy的区别
    C++的函数重载
    gtest 学习二
    gtest 学习一
    char* wchar* char wchar转换
    iconv 编译不通过问题
    嵌入式常用库
    驱动编程class_create说明
    libiconv 交叉编译
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2827621.html
Copyright © 2020-2023  润新知