优点
- 降低耦合度,无需if代码块指定处理者
- 可以动态修改处理者,添加,删除,调整次序等
- 易于拓展,符合开闭原则
缺点
- 调试困难
- 容易造成死循环
- 请求可能会不被处理
使用场景
- 有多个处理者可以处理同一个请求,但有各自的运行条件
- 不确定哪个处理者可以处理
/**
* 角色(Request)
*/
public class PurchaseRequest {
private String item;
private int price;
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
/**
* 角色(Handler)
*/
public abstract class Handle {
protected Handle handle;
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Handle getHandle() {
return handle;
}
public void setHandle(Handle handle) {
this.handle = handle;
}
public abstract void handleRequest(PurchaseRequest purchaseRequest);
}
/**
* 角色(ConcreteHandler)
*/
public class Person extends Handler {
public Person() {
this.setName("个人");
}
@Override
public void handleRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() <= 100){
System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
}else{
System.out.println(this.getName() + "无法处理,上报:" + this.getHandle().getName());
this.getHandle().handleRequest(purchaseRequest);
}
}
}
/**
* 角色(ConcreteHandler)
*/
public class Group extends Handler {
public Group() {
this.setName("组织");
}
@Override
public void handleRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() <= 500){
System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
}else{
System.out.println(this.getName() + "无法处理,上报:" + this.getHandle().getName());
this.getHandle().handleRequest(purchaseRequest);
}
}
}
/**
* 角色(ConcreteHandler)
*/
public class Company extends Handler {
public Company() {
this.setName("公司");
}
@Override
public void handleRequest(PurchaseRequest purchaseRequest) {
System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
}
}
测试类
public class Test {
public static void main(String[] args) {
PurchaseRequest purchaseRequest = new PurchaseRequest();
purchaseRequest.setItem("idea");
purchaseRequest.setPrice(50);
Person person = new Person();
Group group = new Group();
Company company = new Company();
person.setHandle(group);
group.setHandle(company);
person.handleRequest(purchaseRequest);
System.out.println("==============================================");
PurchaseRequest purchaseRequest2 = new PurchaseRequest();
purchaseRequest2.setItem("idea");
purchaseRequest2.setPrice(5000);
person.handleRequest(purchaseRequest2);
}
}
结果