// 20210202
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现责任链模式
责任链模式核心思想
- 如其字面意思,一个链式结构,通俗来讲,就是每一层元素只有两个选择
- 权限够,直接通过请求,并作出相应动作
- 权限不够,抛给上级
程序源代码
- 此处实现公司加薪和请假系统,具体成员&规则如下:
- 经理:只能批准两天以下的请假
- 总监:只能批准五天以下的请假
- 总经理:
- 只能批准50天以下的假期
- 接受500元以下的加薪
- 董事长:可以批准100天以下的假期,100天以上直接让他滚蛋
/**
* 处理者父类
*/
public abstract class Manager {
protected String name;
protected Manager superManager = null;//该管理者的上级
protected String position_name;
//构造必须写名字,不提供咋再从外部设置名字的机会
public Manager(String name,String position_name){
this.name = name;
this.position_name = position_name;
}
public void setSuperManager(Manager superManager) {
this.superManager = superManager;
}
//申请请求
public abstract void handlerRequest(Request request);
}
/**
* 请求类
*/
public class Request {
private String requestType;//申请类别
private String requestContent;//申请内容
private int number;//数量
private String applicant_name;
public Request(String requestType,int number,String applicant_name){
this.requestType = requestType;
this.number = number;
this.applicant_name = applicant_name;
}
public String getRequestType() {
return requestType;
}
public String getRequestContent() {
return requestContent;
}
public void setRequestContent(String requestContent) {
//在此处将名字和请求类型以及内容合并
this.requestContent = "["+applicant_name+"]_"+requestType+":"+requestContent;
}
public int getNumber() {
return number;
}
}
/**
* 经理类
*/
public class CommomManager extends Manager{
public CommomManager(String name,String position_name){
super(name,position_name);
}
@Override
public void handlerRequest(Request request) {
if(request.getRequestType().equals("请假")
&&request.getNumber()<=2){
//小于等于两天的请假申请可以批
System.out.println("("+position_name+")"
+name+":" + request.getRequestContent()+
",时长:"+request.getNumber()+"天,被批准");
}else {
//其余交给上级批准
if(superManager!=null){
superManager.handlerRequest(request);
}else{
System.out.println("系统出现错误,请联系管理员...");
}
}
}
}
/**
* 总监类
*/
public class Majordomo extends Manager {
public Majordomo(String name,String position_name){
super(name,position_name);
}
@Override
public void handlerRequest(Request request) {
if(request.getRequestType().equals("请假")
&& request.getNumber()<=5){
System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
}else{//其余请求申请上级
if(superManager!=null){
superManager.handlerRequest(request);
}else{
System.out.println("系统出现错误,请联系管理员...");
}
}
}
}
/**
* 总经理类
*/
public class GeneralManager extends Manager {
public GeneralManager(String name,String position_name){
super(name,position_name);
}
@Override
public void handlerRequest(Request request) {
if(request.getRequestType().equals("请假")){
if(request.getNumber() < 50)
//总经理能批小于50天的假期
System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
else
superManager.handlerRequest(request);
}else if(request.getRequestType().equals("加薪")) {
if (request.getNumber() <= 500)
System.out.println("("+position_name+")"+name + ":" + request.getRequestContent() + ",金额:¥" + request.getNumber() + ",被批准");
else
System.out.println("("+position_name+")"+name + ":" + request.getRequestContent() + ",金额:¥" + request.getNumber() + ",再说吧");
}//判断条件优化,防止每次判断三次
}
}
/**
* 董事长类
*/
public class Chairman extends Manager{
public Chairman(String name,String position_name){
super(name,position_name);
}
@Override
public void handlerRequest(Request request) {
if(request.getRequestType().equals("请假")){
//董事长能批100天以下的假期,以上直接让其滚蛋
if(request.getNumber()<=100)
System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,被批准");
else
System.out.println("("+position_name+")"+name+":" + request.getRequestContent()+",时长:"+request.getNumber()+"天,去财务办个手续,收拾收拾东西滚蛋吧");
}else {
System.out.println("请正确填写需求");
}
}
}
/**
* 测试主类
*/
public class Main {
public static void main(String[] args) {
CommomManager commomManager = new CommomManager("张三","经理");
GeneralManager generalManager = new GeneralManager("李四","总经理");
Majordomo majordomo = new Majordomo("王五","总监");
Chairman chairman = new Chairman("李六","董事长");
//设置经理的上级为总监
commomManager.setSuperManager(majordomo);
//设置总监的上级为总经理
majordomo.setSuperManager(generalManager);
//设置总经理的上级为董事长
generalManager.setSuperManager(chairman);
Request request_01 = new Request("请假",1,"John");
request_01.setRequestContent("家里有点事想请个假");
commomManager.handlerRequest(request_01);
Request request_02 = new Request("请假",4,"Mike");
request_02.setRequestContent("家里有亲人结婚");
commomManager.handlerRequest(request_02);
Request request_03 = new Request("请假",10,"Lucy");
request_03.setRequestContent("生病了请假住个院");
commomManager.handlerRequest(request_03);
Request request_04 = new Request("请假",40,"Jar_Chen");
request_04.setRequestContent("老婆生孩子了请产假");
commomManager.handlerRequest(request_04);
Request request_05 = new Request("请假",101,"Uncle_Joe");
request_05.setRequestContent("没啥事儿,就想让董事长知道我的名字");
commomManager.handlerRequest(request_05);
Request request_06 = new Request("加薪",400,"God");
request_06.setRequestContent("我觉得我的能力值这个价钱");
commomManager.handlerRequest(request_06);
Request request_07 = new Request("加薪",1000,"Check_To");
request_07.setRequestContent("爸爸天下第一!");
commomManager.handlerRequest(request_07);
}
}
- 输出如下:
以上
希望对大家有所帮助