`

责任链模式小记【原创】

阅读更多

 

          中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?

  既然有这么多的问题,那我们要想办法来解决这些问题,我们可以抽象成这样一个结构,女性的请求先发送到父亲类,父亲类一看是自己要处理的,就回应处理,如果女儿已经出嫁了,那就要把这个请求转发到女婿来处理,那女婿一旦去天国报道了,那就由儿子来处理这个请求,类似于这样请求:

  父亲、丈夫、儿子每个节点有两个选择:要么承担责任,做出回复;要么把请求转发到后序环节。结构分析的已经很清楚了,那我们看怎么来实现这个功能,先看类图:

我们使用数字来代表女性的不同状态,1是未结婚,2是已经结婚的,而且丈夫建在,3是丈夫去世了的

从类图上看,三个实现类Father、Husband、Son只要实现构造函数和父类的中抽象方法就可以了,具体怎么处理这些请求,都已经转移到了Hanlder抽象类中,我们来看Hanlder怎么实现:

/**
* 
* 
* 父系社会,那就是男性有至高权利,handler控制权
*/
public abstract class Handler {
//能处理的级别
private int level =0;
//责任传递,下一个人责任人是谁
private Handler nextHanlder;
//每个类都要说明一下自己能处理哪些请求
public Handler(int _level){
this.level = _level;
}
//一个女性(女儿,妻子或者是母亲)要求逛街,你要处理这个请求
public final void HandleMessage(IWomen women){
if(women.getType() == this.level){
this.response(women);
}else{
if(this.nextHanlder != null){ //有后续环节,才把请求往后递送
this.nextHanlder.HandleMessage(women);
}else{ //已经没有后续处理人了,不用处理了
System.out.println("-----------没地方请示了,不做处理!---------\n");
}
}
}
/*
* 如果你属于你处理的返回,你应该让她找下一个环节的人,比如
* 女儿出嫁了,还向父亲请示是否可以逛街,那父亲就应该告诉女儿,应该找丈夫请示
*/
public void setNext(Handler _handler){
this.nextHanlder = _handler;
}
//有请示那当然要回应
public abstract void response(IWomen women);
}

 

  

  有没有看到,其实在这里也用到模版方法模式,在模版方法中判断请求的级别和当前能够处理的级别,如果相同则调用基本方法,做出反馈;如果不相等,则传递到下一个环节,由下一环节做出回应。基本方法response要各个实现类都要实现,我们来看三个实现类:

/**
*
* 父亲
*/
public class Father extends Handler {
//父亲只处理女儿的请求
public Father(){
super(1);
}
//父亲的答复
@Override
public void response(IWomen women) {
System.out.println("--------女儿向父亲请示-------");
System.out.println(women.getRequest());
System.out.println("父亲的答复是:同意\n");
}
}
/**
*
* 丈夫类
*/
public class Husband extends Handler {
//丈夫只处理妻子的请求
public Husband(){
super(2);
}
//丈夫请示的答复
@Override
public void response(IWomen women) {
System.out.println("--------妻子向丈夫请示-------");
System.out.println(women.getRequest());
System.out.println("丈夫的答复是:同意\n");
}
}
/**
*
* 儿子类
*/
public class Son extends Handler {
//儿子只处理母亲的请求
public Son(){
super(3);
}
//儿子的答复
public void response(IWomen women) {
System.out.println("--------母亲向儿子请示-------");
System.out.println(women.getRequest());
System.out.println("儿子的答复是:同意\n");
}
}

 

  这三个类都很简单,构造方法那是你必须实现的,父类已经定义了,子类不实现编译不通过,通过构造方法我们设置了各个类能处理的请求类型,Father只能处理请求类型为1(也就是女儿)的请求;Husband只能处理请求类型类2(也就是妻子)的请求;儿子只能处理请求类型为3(也就是目前)的请求。
      IWomen接口代码:

/**
* 
* 古代悲哀女性的总称
*/
public interface IWomen {
//获得个人状况
public int getType();
//获得个人请示,你要干什么?出去逛街?约会?还是看电影
public String getRequest();
}

 

Woman类:

/**
*
* 古代女性的总称
*/
public class Women implements IWomen{
/*
* 通过一个int类型的参数来描述妇女的个人状况
* 1---未出嫁
* 2---出嫁
* 3---夫死
*/
private int type=0;
//妇女的请示
private String request = "";
//构造函数传递过来请求
public Women(int _type,String _request){
this.type = _type;
//为了显示好看点,我在这里做了点处理
switch(this.type){
case 1:
this.request = "女儿的请求是:" + _request;
break;
case 2:
this.request = "妻子的请求是:" + _request;
break;
case 3:
this.request = "母亲的请求是:" + _request;
}
}
//获得自己的状况
public int getType(){
return this.type;
}
//获得妇女的请求
public String getRequest(){
return this.request;
}
}

 

我们再来看Client类是怎么描述古代这一个礼节的:

/**
*
* 我们后人来看这样的社会道德
*/
@SuppressWarnings("all")
public class Client {
public static void main(String[] args) {
//随机挑选几个女性
Random rand = new Random();
ArrayList<IWomen> arrayList = new ArrayList();
for(int i=0;i<5;i++){
arrayList.add(new Women(rand.nextInt(4),"我要出去逛街"));
}
//定义三个请示对象
Handler father = new Father();
Handler husband = new Husband();
Handler son = new Son();
//设置请示顺序
father.setNext(husband);
husband.setNext(son);
for(IWomen women:arrayList){
father.HandleMessage(women);
}
}
}

 

运行结果如下:

一句话概括责任链模式:职责链模式:之类的自身迭代,与装饰相识

更多信息请查看 java进阶网 http://www.javady.com

2
0
分享到:
评论
2 楼 liuwei8728 2012-04-16  
有意思嘛  还原创  明明别人弄过的例子 
1 楼 touch_123 2012-04-16  

相关推荐

    thinkphp5.0反序列化链小记.pdf

    ### ThinkPHP 5.0 反序列化链分析与实战经验分享 #### 一、概述 在本篇文章中,我们将深入探讨ThinkPHP 5.0框架中的一个安全漏洞——反序列化链攻击,并通过实际案例来理解其原理及利用方法。ThinkPHP是一款流行的...

    android开发小记

    在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...

    java小记.rar

    这份"java小记.rar"压缩包很可能包含了作者多年从事Java Web开发的经验总结,可能包括代码示例、笔记、最佳实践等内容。 在Java Web开发中,Servlet是核心部分,它是一个Java类,用于扩展服务器的功能,处理HTTP...

    【咬人草小记,阅读附答案】 咬人草小记阅读答案.docx

    这篇文章《咬人草小记》便是对这种植物的描述,以及作者与它亲密接触后的体验与思考。 文章的开始,是一段友人的警告:“这草,你可不能碰!”正是这句话,将作者的注意力引向了这种奇特的生物。咬人草的外表并...

    C++编程小记,经典收藏

    ### C++11 新特性详解 #### 一、Auto 关键字的新用途 - **旧用途**:在C++11之前,`auto`关键字主要用于指定变量的存储期。 - **新用途**:C++11引入了类型推断的概念,`auto`变成了一个类型占位符,用于告诉...

    Linux boost库安装、编译问题小记

    环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed ...小记一下。以备以后参考。  boost 库做得真好。在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。  全部编译是很痛苦的过程

    随笔小记.doc

    随笔小记.doc

    GeoStudio学习小记.pdf

    GeoStudio学习小记

    数据字典-小记及用户部分1

    以下是对标题"数据字典-小记及用户部分1"中所提及的数据元素进行的详细说明: 1. 用户数据元素: - **账号**:用户ID,类型为int,长度11,用于唯一标识每个用户。 - **密码**:字符串类型,长度20,存储用户登录...

    每日小记,记录账单和日记

    这种直观的展示可以帮助用户更好地理解自己的消费模式,比如哪个月份花费最多,哪个类别经常超出预算。同时,对于日记部分,应用可能也提供了按日期或关键词搜索的功能,方便用户回顾特定的时刻或事件。 此外,为了...

    python进行爬虫小记

    正则表达式是一种常见的方式,可以匹配特定的字符串模式。例如,使用`re`库编写的正则表达式可以匹配并提取链接或特定文本。然而,对于更复杂的HTML结构,推荐使用XPath或CSS选择器。XPath是XML路径语言,可以通过`...

    刘重威将军小记.docx

    刘重威将军小记.docx

    随笔小记文档及若干代码

    随笔小记的文档,自己记录的一些文档,仅供参考

    数据结构习题总结 拾荒小记

    2. **模式匹配**:这是一个在字符串中寻找特定子串的问题,常见的算法有KMP(Knuth-Morris-Pratt)算法和Boyer-Moore算法,它们在文本搜索和文本处理中非常实用。 3. **矩阵**:矩阵是二维数组,常见的操作有矩阵...

    TCP-IP小记

    首先,TCP/IP模型分为四层,分别是应用层、传输层、网络层和数据链路层。每层都有其特定的功能和协议。 1. 应用层:这是最顶层,直接与用户应用程序交互。常见的应用层协议有HTTP(超文本传输协议)用于浏览网页,...

    当代班主任工作小记.doc

    当代班主任工作小记.doc

    小学语文圣诞节作文圣诞小记

    小学语文圣诞节作文圣诞小记

    STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备_rezip.zip

    STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备_rezip

    STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备1_rezip.zip

    STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备1_rezip

Global site tag (gtag.js) - Google Analytics