java设计模式之责任

来源:互联网 发布:金蝶软件服务商 编辑:程序博客网 时间:2024/06/12 20:34

1,需求构建

例:工厂发生工伤事件,根据事件的类别比如1,2,3,4,5,6级别,根据工伤的级别,分别由组长,线长,主任,厂长,老板,政府来进行处理。低级者别处理不了就传递给高级别者来进行处理。直到处理者处理完了。

2,分析

很明显的,组长,线长,主任,厂长,老板,政府这些人可以归纳为处理者,抽象出来为两个功能: 1. 处理事件 2. 传递事件 责任设计模式的连个重要角色: 1,抽象的处理者 2,具体的处理者

3,代码实现

为了代码简洁,我这里创建到主任级别

// 工伤类class Wound{    private String name;    private Integer level;   // 工伤级别    public Wound(String name, Integer level) {        this.name = name;        this.level = level;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getLevel() {        return level;    }    public void setLevel(Integer level) {        this.level = level;    }}// 工伤处理抽象类public interface WoundHandler {    // 进行处理工伤,如果不能处理传递给下个处理者    void handlerWound(Wound wound);}// 可以处理级别1的工伤class 组长 implements WoundHandler{    private WoundHandler nextHandler;    public WoundHandler getNextHandler() {        if (nextHandler == null){            nextHandler = new 线长();        }        return nextHandler;    }    public void setNextHandler(WoundHandler nextHandler) {        this.nextHandler = nextHandler;    }    @Override    public void handlerWound(Wound wound) {        if (1 == wound.getLevel()){            System.out.println(getClass()+"处理了工伤");        }else {            this.getNextHandler().handlerWound(wound);        }    }}// 可以处理级别2的工伤class 线长 implements WoundHandler{    private WoundHandler nextHandler;    public WoundHandler getNextHandler() {        if (nextHandler == null){            nextHandler = new 主任();        }        return nextHandler;    }    public void setNextHandler(WoundHandler nextHandler) {        this.nextHandler = nextHandler;    }    @Override    public void handlerWound(Wound wound) {        if (2 == wound.getLevel()){            System.out.println(getClass()+"处理了工伤");        }else {            this.getNextHandler().handlerWound(wound);        }    }}// 可以处理级别3的工伤class 主任 implements WoundHandler{    private WoundHandler nextHandler;    public WoundHandler getNextHandler() {        if (nextHandler == null){            nextHandler = new 厂长();        }        return nextHandler;    }    public void setNextHandler(WoundHandler nextHandler) {        this.nextHandler = nextHandler;    }    @Override    public void handlerWound(Wound wound) {        if (3 == wound.getLevel()){            System.out.println(getClass()+"处理了工伤");        }else {            this.getNextHandler().handlerWound(wound);        }    }}// 客户端调用功能public class Client {    public static void main(String[] args) {        Wound wound = new Wound("zhangsan",2);        WoundHandler zuzhang = new 组长();        zuzhang.handlerWound(wound);    }}

4,总结

责任设计模式又分为存责任模式的和不存的责任模式,存的指的是,具体的处理者,要不处理请求,完毕,要不就直接传递,但是在现实开发中这种纯粹的情景是不存在的。而且我们也并不关注他们的是否纯粹,只需要他们能处理好客户端的请求就行了。

5,特点

  1. 灵活,正如我们自己实现的tomcat中的过滤器一样,这种可以添加具体处理者非常灵活;
  2. 解耦,客户端完全不需要直到谁处理了我的请求,如果有返回,只需要关心相关的业务。
参考文献
大话设计模式
原创粉丝点击