今天学习了下责任链模式,对责任链模式有了一个初步的了解,这个模式有些复杂
比如有这样一种情况:有三个经理,A是负责人事的,B负责财务,C负责销售。他们都能对自己所管辖的领域里大大小小的事情进行处理。但是有一些新入职的职员根本不认识他俩,有的时候一个人事部的人跑去财务部领导那里报告情况,这个时候B就要把请求指引到A那里去,也有的时候B也不知道要找谁,就把请求传递给C,让C处理,C当然也没有权限处理,但是它知道要给A,于是就把请求给了A。
这样一层一层的将命令下调,直到找到合适的处理者的行为就是责任链模式。每一个经理都有自己的处理权限,而每一个职员终究只用找到一个经理,但最终是能找到合适的。
责任链模式的定义:使得多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该对象,直到所有的对象处理完为止。
每一个处理者都有固定的权限,和他的下任处理者。
抽象处理者类
- package com.gengu.责任链;
- /**抽象处理者*/
- public abstract class Handler {
- //可以处理的级别
- private int level;
- //下一个处理者
- private Handler nextHandler;
- /**
- * 每个处理者都必须得请求作出一个响应
- * 返回一个值 或者打印一条数据
- */
- public Handler(Handler _nextHandler){
- this.nextHandler = _nextHandler;
- }
- public Handler(int level){
- this.level = level;
- }
- public final void handleMessage(Roler roler){
- //如果权限够 则作出响应
- if(this.level == roler.level){
- this.request();
- //如果有后续的角色 就把请求往下送
- }else if(this.nextHandler != null){
- this.nextHandler.handleMessage(roler);
- }else {
- System.out.println("对不起没有可以处理的角色");
- }
- }
- //对请求作出处理
- public abstract void request();
- public void setNextHandler(Handler nextHandler) {
- this.nextHandler = nextHandler;
- }
- }
具体处理者
- package com.gengu.责任链;
- /**抽象处理者*/
- public class HandlerA extends Handler{
- //要设置自己的处理级别
- public HandlerA(){
- super(1);
- }
- @Override
- public void request() {
- System.out.println("我是处理者A,我的处理权限是1,我有权利处理");
- };
- }
- package com.gengu.责任链;
- /**抽象处理者*/
- public class HandlerB extends Handler{
- //要设置自己的处理级别
- public HandlerB(){
- super(2);
- }
- @Override
- public void request() {
- System.out.println("我是处理者B,我的处理权限是2,我有权利处理");
- };
- }
- ……
角色抽象类
- package com.gengu.责任链;
- /**
- * 角色抽象类
- * */
- public abstract class Roler {
- protected int level;
- public Roler(int level){
- this . level = level;
- }
- public void doSome(){
- System.out.println("我是角色,我的级别是"+level+"我得做些什么");
- }
- }
具体角色类
- package com.gengu.责任链;
- /**
- * 角色抽象类
- * */
- public class RolerA extends Roler{
- public RolerA(){
- super(1);
- }
- }
- package com.gengu.责任链;
- /**
- * 角色抽象类
- * */
- public class RolerB extends Roler{
- public RolerB(){
- super(2);
- }
- }
测试类
- package com.gengu.责任链;
- public class Client {
- public static void main(String[] args) {
- Handler handlerA = new HandlerA();
- Handler handlerB = new HandlerB();
- handlerA.setNextHandler(handlerB);
- Roler rolerB = new RolerB();
- handlerA.handleMessage(rolerB);
- }
- }
责任链模式的优点是,能将请求和处理分开请求者不用直到是谁处理的,处理者可以不用直到请求的全貌,两者解耦。但它的缺点是性能问题很大,每一个请求都要从链头遍历到链尾。