zoukankan      html  css  js  c++  java
  • 责任链模式小记【原创】

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

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

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

    我们使用数字来代表女性的不同状态,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);
    }
    }
    }

    运行结果如下:

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

    再次声明:这只是我读《设计模式之禅》之后,怕自己忘记,写的读书笔记,拿出来分享,愿意看的就一起学习,不愿意看的,请绕道就是!
     

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/winkey4986/p/2445426.html
Copyright © 2011-2022 走看看