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);
    }
    }
    }

    运行结果如下:

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

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

  • 相关阅读:
    BaseServlet的编写
    两个线程交替打印1-100
    java集合中的HashMap源码分析
    mybatis一级缓存与二级缓存的原理
    mybatis的执行流程
    spring IOC的理解
    一文彻底搞懂面试中常问的各种“锁”
    Dubbo相关的基础
    Servlet基础
    文件传输基础
  • 原文地址:https://www.cnblogs.com/winkey4986/p/2445426.html
Copyright © 2011-2022 走看看