您的位置:首页 > 编程语言 > Java开发

设计模式之责任链模式

2015-12-16 00:00 387 查看
摘要: 责任链模式是一种非常有用的模式。一般分为纯责任链模式,非纯责任链模式。区别只是前者要么处理,要么移交给下一个处理。不存在既处理又交给下一个处理。

责任链原型非常简单,其实就是把可以处理的类串成一个链表,然后依次判断执行或者交给链接的下一个。

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

责任链原型非常简单,其实就是把可以处理的类串成一个链表,然后依次判断执行或者交给链接的下一个。

直接上代码:

一、纯的责任链模式:

报销大家都遇到过,如果小于1w的由部门经理审核,1W和10W之间由总经理审核,10W及以上由CEO审核。

1.抽象经理

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.CEO

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.总经理

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.测试

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.抽象过滤器

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息