java常用设计模式之职责链模式
---------------------- 职责链模式(Chain of Responsibility) -----------------------
(1)
Chain of Responsibility职责链模式:
为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
-->
要沿着链转发请求,并保证接受者为隐式的,每个链上的对象都有一致的处理请求和访问链上后继者的接口(即如下实例中,在自己方法中再调用一次相同的方法)。(2)
public class Boy {
?
?private boolean hasCar; // 是否有车
?private boolean hasHouse; // 是否有房
?private boolean hasResponsibility; // 是否有责任心?public Boy() {
?}?public Boy(boolean hasCar, boolean hasHouse, boolean hasResponsibility) {
??this.hasCar = hasCar;
??this.hasHouse = hasHouse;
??this.hasResponsibility = hasResponsibility;
?}?public boolean isHasCar() {
??return hasCar;
?}?public void setHasCar(boolean hasCar) {
??this.hasCar = hasCar;
?}?public boolean isHasHouse() {
??return hasHouse;
?}?public void setHasHouse(boolean hasHouse) {
??this.hasHouse = hasHouse;
?}?public boolean isHasResponsibility() {
??return hasResponsibility;
?}?public void setHasResponsibility(boolean hasResponsibility) {
??this.hasResponsibility = hasResponsibility;
?}
}public interface Handler {
? public void handleRequest(Boy boy);
}public class HouseHandler implements Handler {
?
?private Handler handler;?public HouseHandler(Handler handler) {??this.handler = handler;
?}?public Handler getHandler() {
??return handler;
?}?public void setHandler(Handler handler) {
??this.handler = handler;
?}?public void handleRequest(Boy boy) {
??if (boy.isHasHouse()) {
???System.out.println("没想到吧,我还有房子");
??} else {
???System.out.println("我也没有房");
???handler.handleRequest(boy);
??}
?}
}public class CarHandler implements Handler {?private Handler handler;?public CarHandler(Handler handler) {
??this.handler = handler;
?}?public Handler getHandler() {
??return handler;
?}?public void setHandler(Handler handler) {
??this.handler = handler;
?}?public void handleRequest(Boy boy) {
??if (boy.isHasCar()) {
???System.out.println("呵呵,我有辆车");
??} else {
???System.out.println("我没有车");
???handler.handleRequest(boy);
??}
?}
}public class ResponsibilityHandler implements Handler {?private Handler handler;?public ResponsibilityHandler(Handler handler) {
??this.handler = handler;
?}?public Handler getHandler() {
??return handler;
?}?public void setHandler(Handler handler) {
??this.handler = handler;
?}?public void handleRequest(Boy boy) {
??if (boy.isHasResponsibility()) {
???System.out.println("我只有一颗带Responsibility的心");
??} else {
???System.out.println("更没有责任心");
???handler.handleRequest(boy);
??}
?}
}public class Girl {
?
?public static void main(String[] args) {
??// 这个boy没有车,也没有房,不过很有责任心
??Boy boy = new Boy(false, false, true);
??????????????? // 也可以使用setHanlder方法
??Handler handler = new CarHandler(new HouseHandler(
????new ResponsibilityHandler(null)));
??handler.handleRequest(boy);
?}
}==>
如何实例使请求沿着链在各接受对象中传递,当没被第一个接受对象接受时,会传递给第二个对象,若被第一个对象接受了,则不传递下去:
1.各具体的接受对象采用这样的构造方法:
public CarHandler(Handler handler) { this.handler = handler; }
2.各具体的接受对象实现接口的方法handleRequest()中.在调用时,若被接受,则执行true的内容,若不被接受,则执行false的内容,并继续调用再调用handleRequest()方法.
3.在最后的测试类中,生成具体的handler时,用多层包含的形式.这样,在调用了上一层car的方法后,会调用house的相应方法,最后再调用ResponsibilityHandler的方法.==>前两个handler是采用了有参数的构造方法,最后一个是采用了为NULL的构造方法
转自:http://shenzhenchufa.blog.51cto.com/730213/161581