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的构造方法
 

 

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