java设计模式之责任链模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因.下面主要说一说责任链模式.

  • 责任链模式是一种对象的行为模式.在责任链模式里面,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上进行传递,直到这个链上的某一个对象来处理请求,发送这个请求的客户端并不知道哪一个对象最终来处理这个请求.这使得系统可以在不影响客户端的情况下来动态的重新组织和分配责任.

下面说说比较常见的一个例子,在我们开发过程中,我们可能为了一个判断一个语句,常常会写出大量的if else语句,这使得我们在后期的维护和开发上可能会存在大量的麻烦,每当我们增加一个新的判断,都需要在原来的代码上面进行修改,这很显然不符合开闭原则(对修改关闭,对扩展开放).在这种情况下,我们就可以考虑使用责任链模式了.由于只是简单介绍了一下该模式,所以demo就做的比较简单了.废话不多说了,直接上代码.先看一下目录结构:

java设计模式之责任链模式_第1张图片
责任链.png

AbstractAction.java

 package com.rain.design.abliti;

 public abstract class AbstractAction implements Action{

    public Action action;
    @Override
    public void todo(String type) {
    
        System.out.println("我是总部,你们处理不了就给我处理!!");
    }

    public Action getAction() {
        return action;
    }
    public void setAction(Action action) {
        this.action = action;
    }
}

Action.java

 package com.rain.design.abliti;
    public interface Action {
      void todo(String type);
  }

Guangdong.java

package com.rain.design.abliti;

public class Guangdong extends AbstractAction{

    private static final String type="广东";
    @Override
    public void todo(String type) {
        if(this.type.equals(type)){
          System.out.println("我是广东处理中心,我只处理广东的业务");
        }else{
            Action action = this.getAction();

            if (action != null) {
                action.todo(type);
            }else{
                super.todo(type);
            }
        }
    }
}

Hubei.java

package com.rain.design.abliti;

public class Hubei extends AbstractAction{
    private static final String type="湖北";
    @Override
    public void todo(String type) {
        if(this.type.equals(type)){
            System.out.println("我是湖北处理中心,我只处理湖北的业  务");
        }else{
            Action action = this.getAction();

            if (action != null) {
                action.todo(type);
            }else{
                super.todo(type);
            }
        }
    }
}

Test.java

package com.rain.design.abliti;

public class Test {

public static void main(String[] args) {
    
    String type = "广东";

    Hunan hunan = new Hunan();
    Hubei hubei = new Hubei();
    Jiangxi jiangxi = new Jiangxi();
    Guangdong guangdong = new Guangdong();
    
    hunan.setAction(hubei);
    hubei.setAction(jiangxi);
    jiangxi.setAction(guangdong);
    guangdong.setAction(null);

    hunan.todo(type);
  }
}

下面的就不贴了,都是类似的了.现在,当我们的type为"广东"时,前面的type匹配不上的时候,就会依次向后传递任务,直到有一个对象可以处理.另外,比如说我们又加了一个新的需求,河北也需要来处理这个任务,我们只需要再写一个类来继承AbstractAction它就可以了,里面就是由它来处理自己的逻辑了,对原来的代码不会有所改动,这也就符合了开闭原则,也极大的节约了我们的开发时间.如果还是以前的方式来改动的话,有很大的可能会出错,并且大量的if else嵌套看起来也不爽.

好了,本文也只是对责任链模式的一点粗浅的理解,希望能启到一点抛砖引玉的作用,欢迎各位大神拍砖指正.

你可能感兴趣的:(java设计模式之责任链模式)