某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。
要求绘制相应的类图并使用Java语言编程模拟实现。
UML类图
package com.zheng;
public abstract class Approver {
protected Approver successor;//定义后继对象
protected String name;//审批者姓名
public Approver(String name) {
this.name=name;
}
//设置后继审批者
public void setSuccessor(Approver successor) {
this.successor=successor;
}
//抽象请求处理方法
public abstract void processRequest(PurchaseRequest request);
}
package com.zheng;
public class PurchaseRequest {
private int time; //请假时间
public PurchaseRequest(int time) {
this.time=time;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
package com.zheng;
public class Director extends Approver {
public Director(String name) {
super(name);
}
//具体请求处理方法
@Override
public void processRequest(PurchaseRequest request) {
if(request.getTime()<3) {
System.out.println("主任"+this.name+"批准请假:"+request.getTime());
System.out.println("请假成功");
}else {
this.successor.processRequest(request);//转发请求
}
}
}
package com.zheng;
public class VicePresident extends Approver {
public VicePresident(String name) {
super(name);
}
//具体请求处理方法
@Override
public void processRequest(PurchaseRequest request) {
if(request.getTime()<10) {
System.out.println("经理"+this.name+"批准请假:"+request.getTime());
System.out.println("请假成功");
}else {
this.successor.processRequest(request);//转发请求
}
}
}
package com.zheng;
public class President extends Approver {
public President(String name) {
super(name);
}
//具体请求处理方法
@Override
public void processRequest(PurchaseRequest request) {
if(request.getTime()<30) {
System.out.println("总经理"+this.name+"批准请假:"+request.getTime());
System.out.println("请假成功");
}else {
System.out.println("对不起,请假时间太长。总经理无权批假。");
}
}
}
package com.zheng;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//职责中的关系对象
Approver w1,w2,w3;
w1=new Director("小红1");
w2=new VicePresident("小红2");
w3=new President("小红3");
//创建职责链
w1.setSuccessor(w2);
w2.setSuccessor(w3);
while(true) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入请假天数:");
int time=scan.nextInt();
PurchaseRequest pr1=new PurchaseRequest(time);
w1.processRequest(pr1);
}
}
}
运行截图
职责链模式优点:1、降低了系统的耦合性。2、简化了对象之间的相互连接。3、可以灵活的增加对请求处理的职责。4、符合开闭原则
职责链模式缺点:1、一个请求没有具体的接受者,客户发出的请求可能得不到解决。2、建链不当,可能会造成系统陷入死循环。3、对于较长的请求、每个处理对象可能都会处理一部分。对系统的性能造成一定的影响。