设计模式之责任链模式

责任链模式是一种很是有用的模式。通常分为纯责任链模式,非纯责任链模式。区别只是前者要么处理,要么移交给下一个处理。不存在既处理又交给下一个处理。java

责任链原型很是简单,其实就是把能够处理的类串成一个链表,而后依次判断执行或者交给连接的下一个。session


直接上代码:
ide

1、纯的责任链模式:测试

报销你们都遇到过,若是小于1w的由部门经理审核,1W和10W之间由总经理审核,10W及以上由CEO审核。this

1.抽象经理url

public abstract class AbstractManager {
    private AbstractManager nextPoint;

    public abstract void check(double money);

    public AbstractManager getNextPoint() {
        return nextPoint;
    }

    public void setNextPoint(AbstractManager nextPoint) {
        this.nextPoint = nextPoint;
    }
}

2.CEOspa

public class CEO extends AbstractManager {

    @Override
    public void check(double money) {
        if (money >= 100000) {
            System.out.println("CEO check the money.....");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

3.部门经理日志

public class DepartmentManager extends AbstractManager {

    @Override
    public void check(double money) {
        if (money < 10000) {
            System.out.println("DepartmentManager check the money");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

4.总经理code

public class GeneralManager extends AbstractManager {

    @Override
    public void check(double money) {
        if (money >= 10000 && money < 100000) {
            System.out.println("General manager check the money .....");
        } else {
            if (getNextPoint() != null) {
                getNextPoint().check(money);
            }
        }
    }
}

5.测试
get

public static void main(String[] args) {
    AbstractManager ceo = new CEO();
    AbstractManager departmentManager = new DepartmentManager();
    AbstractManager generalManager = new GeneralManager();
    //建立责任链
    departmentManager.setNextPoint(generalManager);
    generalManager.setNextPoint(ceo);

    //直接交给部门经理处理,其余就不用管啦。
    departmentManager.check(999999);
}

结果就是

5.1 小于1W的

    DepartmentManager check the money

5.2 大于等于1w小于10w的 

    General manager check the money.....

5.4 大于等于10w的

    CEO check the money.....

1、不纯的责任链模式:

1.抽象过滤器

public abstract class Filter {
    private Filter nextFilter;

    public abstract void handle(Request request);

    public Filter getNextFilter() {
        return nextFilter;
    }

    public void setNextFilter(Filter nextFilter) {
        this.nextFilter = nextFilter;
    }
}

2.日志过滤器

public class LogFilter extends Filter {
    @Override
    public void handle(Request request) {
        if (request.getUrl() != null && request.getUrl().contains("payBill")) {
            System.out.println("log write payBill");
        }
        if (getNextFilter() != null) {
            getNextFilter().handle(request);
        }

    }
}

3.session过滤器

public class SessionFilter extends Filter {
    @Override
    public void handle(Request request) {

        if (request.getSessionId() == null) {
            System.out.println("session id is none, check the username and password.");
            System.out.println("username and password check successful");
        } else {
            System.out.println("session id check pass");
        }

        if (getNextFilter() != null) {
            getNextFilter().handle(request);
        }
    }
}

4.请求信息

public class Request {
    private String userName;
    private String password;
    private String sessionId;
    private String content;
    private String charSet;
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getCharSet() {
        return charSet;
    }

    public void setCharSet(String charSet) {
        this.charSet = charSet;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }


    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

5.测试代码

public static void main(String[] args) throws UnsupportedEncodingException {
    Filter charSetFilter = new CharacterFilter();
    Filter logFilter = new LogFilter();
    Filter sessionFilter = new SessionFilter();
    sessionFilter.setNextFilter(logFilter);
    logFilter.setNextFilter(charSetFilter);



    Request req = new Request();
    req.setContent("今每天气不错");
    req.setSessionId("1111");
    req.setCharSet("GBK");
    req.setUserName("lubby");
    req.setPassword("Jack1234565");
    req.setUrl("/payBill");
    sessionFilter.handle(req);
}
相关文章
相关标签/搜索