本文来讨论下java设计模式之责任链模式。

这个很好理解,就是踢皮球嘛,我解决不了,找下一个人去解决。反正总要给你找到一个人来解决。 为了找到解决的人,我们得知道事件等级,才能找到对应的人来解决。 如果这个人解决不了,下一个人来解决。责任链就出来了。 比如,我们有个新闻.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package top.txiner.chainofresponsibility;

/**
 * @author : hundred
 * time: 18-1-18
 * website : http://txiner.top
 * 懵懂的小白
 */
public interface News {
    int getLevel();
    String getReport();
}

所有的新闻无外乎有这两个属性,新闻严重程度,新闻内容。比如出车祸的新闻

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class Hurt implements News {

    private int level;
    private String report;

    public Hurt(int level, String report) {
        this.level = level;
        this.report = report;
    }

    @Override
    public int getLevel() {
        return level;
    }

    @Override
    public String getReport() {
        return report;
    }
}

不复杂的事件。既然新闻出来啦,那么就得有媒体来决定用什么样的事件来处理。比如普通事故?还是娱乐新闻?抑或政治新闻?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public abstract class Handler {
    private Handler next;
    private int level;

    public Handler(int level) {
        this.level = level;
    }

    public void handleNews(News news){
        if (news.getLevel()==this.level){
            this.report(news);
        }else {
            this.next.handleNews(news);
        }
    }
    public void setNext(Handler handler){
        this.next=handler;
    }
    public abstract void report(News news);
}

看,内容不复杂,这个板块不能报道,我就转给下个板块来报道。我们看看这几家板块吧。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Life extends Handler {
    public Life(int level) {
        super(level);
    }

    @Override
    public void report(News news){
        System.out.println("Life handle news");
        System.out.println(news.getReport());
    }
}

public class Entertainment extends Handler {
    public Entertainment(int level) {
        super(level);
    }

    @Override
    public void report(News news) {
        System.out.println("One star gets hurt");
        System.out.println(news.getReport());
    }
}

public class Politics extends Handler {
    public Politics(int level) {
        super(level);
    }

    @Override
    public void report(News news) {
        System.out.println("One officer gets hurt");
        System.out.println(news.getReport());
    }
}

好了,有记者上战场啦,看看问题!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Reporter {
    public static void main(String[] args) {
        News news=new Hurt(3,"one hit by a car");

        Handler life=new Life(1);
        Handler ent=new Entertainment(2);
        Handler politics=new Politics(3);
        life.setNext(ent);
        ent.setNext(politics);
        life.handleNews(news);
    }
}

问题得解! .......................分割线......................... 责任链呢,屏蔽了解决问题的内部流程,作为一个请求者,不用知道问题是谁解决的。但是,如果出了问题,像调试起来很麻烦。