某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、对于较长的请求、每个处理对象可能都会处理一部分。对系统的性能造成一定的影响。

posted on 2022-08-28 22:20  热爱技术的小郑  阅读(164)  评论(0编辑  收藏  举报