责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了。于是有了想要记录下设计模式的笔记。打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一个更深刻的理解和流畅的表述。
介绍
为请求创建了一个接受者的链,通常一个接收者包含下一个接受者的引用,如果该对象不能处理该请求,就传给下一个。依次类推,直到有处理的对象为止。
应用实例:jsp servlet的Filter,js中的事件冒泡
例子
通过一个例子来深刻的认识他。以前古代女子都遵从着三从四德,三从:一从父亲,二从丈夫,三从儿子。
也就是在家听父亲的,嫁人后,听丈夫的,丧夫后,听儿子的。
那么现在呢,人人平等,那么我就说以后吧,一步小心就是男子三从四德了,那么针对男子进行三从四德进行代码演练。一男子想买键盘,先从母亲开始问起,如果母亲不想理你 ,你就问你妻子,你妻子不理你,你就问你女儿,你女儿也不理,你就啥也不能买。
代码
- 抽象未来男子人类
/**
* @ClassName Human
* @Description 人类
* @Author ouyangkang
* @Date 2018-11-05 10:02
**/
public abstract class Human {
/**
* @Author ouyangkang
* @Description 发起请求
* @Date 10:04 2018/11/5
* @param
* @return void
**/
public abstract void request();
/**
* @Author ouyangkang
* @Description 获取请求的类型
* @Date 10:05 2018/11/5
* @param
* @return java.lang.Integer
**/
public abstract Integer getType();
}
- 具体实现
/**
* @ClassName Man
* @Description 未来男子
* @Author ouyangkang
* @Date 2018-11-05 10:07
**/
public class Man extends Human {
/**
* @Date 2018/11/5 10:09
* @Description 请求
**/
private String request;
/**
* @Date 2018/11/5 10:14
* @Description 1 为入赘 2 已入赘 3 丧妻
**/
private Integer type ;
@Override
public void request() {
System.out.println(request);
}
@Override
public Integer getType() {
return this.type;
}
public Man(String request, Integer type){
this.request = request;
this.type = type;
}
}
- 处理抽象链
/**
* @ClassName Handler
* @Description 责任链
* @Author ouyangkang
* @Date 2018-11-05 10:15
**/
public abstract class Handler {
public static final Integer MOTHER_LEVEL = 1;
public static final Integer WIFE_LEVEL = 2;
public static final Integer DAUGHTER_LEVEL = 3;
public Integer level;
/**
* @Date 2018/11/5 10:16
* @Description 下一个处理者
**/
private Handler nexHandler;
public Handler(Integer level){
this.level = level;
}
/**
* @Author ouyangkang
* @Description 处理信息
* @Date 10:27 2018/11/5
* @param human
* @return void
**/
public void handleMessage(Human human){
if (this.level.equals(human.getType())){
this.response(human);
}else {
if (nexHandler != null){
//传递给下一个处理对象
this.nexHandler.handleMessage(human);
}else {
System.out.println("---------------");
human.request();
System.out.println("没有处理的人了");
}
}
}
/**
* @Author ouyangkang
* @Description 回复未来男子的请求
* @Date 10:18 2018/11/5
* @param
* @return void
**/
public abstract void response(Human human);
public void setNexHandler(Handler nexHandler){
this.nexHandler = nexHandler;
}
}
- 具体实现
/**
* @ClassName Mather
* @Description 母亲
* @Author ouyangkang
* @Date 2018-11-05 10:28
**/
public class Mather extends Handler {
public Mather(){
super(Handler.MOTHER_LEVEL);
}
@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("妈妈爱你 当然同意啦");
}
}
/**
* @ClassName Wife
* @Description TODO
* @Author ouyangkang
* @Date 2018-11-05 10:46
**/
public class Wife extends Handler {
public Wife() {
super(Handler.WIFE_LEVEL);
}
@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("");
}
}
/**
* @ClassName Wife
* @Description TODO
* @Author ouyangkang
* @Date 2018-11-05 10:46
**/
public class Wife extends Handler {
public Wife() {
super(Handler.WIFE_LEVEL);
}
@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("上次你那个机械键盘不是还能用吗 不给买");
}
}
/**
* @ClassName Daughter
* @Description TODO
* @Author ouyangkang
* @Date 2018-11-05 10:48
**/
public class Daughter extends Handler {
public Daughter() {
super(Handler.DAUGHTER_LEVEL);
}
@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("给糖吃就同意");
}
}
- 客户端
/**
* @ClassName Main
* @Description TODO
* @Author ouyangkang
* @Date 2018-11-05 10:49
**/
public class Main {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0 ;i < 5;i++){
Human human = new Man("我要买键盘", random.nextInt(4));
Handler mather = new Mather();
Handler wife = new Wife();
Handler daughter = new Daughter();
mather.setNexHandler(wife);
wife.setNexHandler(daughter);
mather.handleMessage(human);
}
}
}
- 返回结果
-----------------
我要买键盘
给糖吃就同意
-----------------
我要买键盘
上次你那个机械键盘不是还能用吗 不给买
-----------------
我要买键盘
上次你那个机械键盘不是还能用吗 不给买
-----------------
我要买键盘
妈妈爱你 当然同意啦
---------------
我要买键盘
没有处理的人了