设计模式——职责模式
职责模式编程要求:为了促进大学教学质量的提升,学校加大了教学经费的投入,各归口职能部门,如教务处、校团委等都通过二次分配划拨了相应经费到学院支持教学改革、学生创新创业等。为了规范财务报销,财务处颁布了相关财务报销制度,其中规定如下表。
5万元以下 | 单位(学院)负责人审批 |
---|---|
5-10万元以下 | 归口职能部门负责人审批 |
10-30万元以下 | 分管校领导审批 |
30万元以上 | 主管财务校领导审批 |
在报销的时候,我们需要找到对应的负责人进行审批,那么才能进行报销,那么不同的金额要找不同的人就显得十分繁琐,那么有没有办法只上交给一个人,然后层层递交给最后的领导审批呢?职责模式可以实现
python
首先需要创建一个Applicant申请者类,用于申请人填写自己的姓名以及要报销的金额,再Applicant类中有request方法主要是用于向第一层的审批人提交信息,因为我们需要的效果是 单位(学院)负责人->归口职能部门负责人审批->分管校领导->主管财务校领导 在这四个领导中做条件匹配,如果金额过大就交给下一层的领导去处理,最后处理完毕。
from abc import ABCMeta, abstractmethod
#申请人
class Applicant():
def __init__(self,name,expenses):
self.name = name
self.expenses = expenses
def request(self,academyLeader):
print(self.name+"向"+academyLeader.getName()+"("+academyLeader.getTitle()+")提交申请,金额为:"+str(self.expenses))
academyLeader.expensesJudge(self)
def getExpenses(self):
return self.expenses
def getName(self):
return self.name
编写Manager接口,让负责人类继承Manager接口,增加代码的可拓展性,然后以此创建四个负责人类 单位(学院)负责人->归口职能部门负责人审批->分管校领导->主管财务校领导 主要方法有negativeNum对金额是否为0的判断 expensesJudge判断 金额是否资金符合规矩,如不足,触发nextManager方法转交下一层
#审批负责人接口
class Manager(metaclass=ABCMeta):
def __init__(self,name ,title ):
self.name = name
self.title = title
self.nextOne = None
#金额不符合
def negativeNum(self,num):
if int(num) <= 0 :
return 1
return 0
#费用判断
@abstractmethod
def expensesJudge(self,applicant):
pass
#判断金额是否资金符合规矩,如不足,转交下一层
@abstractmethod
def nextManager(self,applicant):
pass
@abstractmethod
def setNextOne(self,manager):
pass
class AcademyLeader(Manager):
def __init__(self,name ,title):
super().__init__(name ,title)
def expensesJudge(self,applicant):
# 金额大小
Expenses = applicant.getExpenses()
# 申请人名称
Name = applicant.getName()
boolean = self.negativeNum(Expenses)
if(boolean == 1):
print("金额不能为负或者零")
return
if Expenses < 50000 and Expenses > 0:
print(Name+"申请金额为:"+str(Expenses)+",经审核,申请通过--经办人:"+self.name+"("+self.title+")")
return
else:
if self.nextOne is not None:
self.nextManager(applicant)
def nextManager(self,applicant):
self.nextOne.expensesJudge(applicant)
def setNextOne(self,manager):
self.nextOne = manager
def getName(self):
return self.name
def getTitle(self):
return self.title
class FunctionalDepartmentLeader(Manager):
def __init__(self,name ,title):
super().__init__(name ,title)
def expensesJudge(self,applicant):
# 金额大小
Expenses = applicant.getExpenses()
# 申请人名称
Name = applicant.getName()
boolean = self.negativeNum(Expenses)
if(boolean == 1):
print("金额不能为负或者零")
return
if Expenses < 100000 and Expenses >= 50000:
print(Name+"申请金额为:"+str(Expenses)+",经审核,申请通过--经办人:"+self.name+"("+self.title+")")
return
else:
if applicant is not None:
self.nextManager(applicant)
def nextManager(self,applicant):
self.nextOne.expensesJudge(applicant)
def setNextOne(self,manager):
self.nextOne = manager
def getName(self):
return self.name
def getTitle(self):
return self.title
class SchoolLeaderInCharge(Manager):
def __init__(self,name ,title):
super().__init__(name ,title)
def expensesJudge(self,applicant):
# 金额大小
Expenses = applicant.getExpenses()
# 申请人名称
Name = applicant.getName()
boolean = self.negativeNum(Expenses)
if(boolean == 1):
print("金额不能为负或者零")
return
if Expenses < 300000 and Expenses >= 100000:
print(Name+"申请金额为:"+str(Expenses)+",经审核,申请通过--经办人:"+self.name+"("+self.title+")")
return
else:
if applicant is not None:
self.nextManager(applicant)
def nextManager(self,applicant):
self.nextOne.expensesJudge(applicant)
def setNextOne(self,manager):
self.nextOne = manager
def getName(self):
return self.name
def getTitle(self):
return self.title
class LeaderInChargeOfFinance(Manager):
def __init__(self,name ,title):
super().__init__(name ,title)
def expensesJudge(self,applicant):
# 金额大小
Expenses = applicant.getExpenses()
# 申请人名称
Name = applicant.getName()
boolean = self.negativeNum(Expenses)
if(boolean == 1):
print("金额不能为负或者零")
return
if Expenses >= 300000:
print(Name+"申请金额为:"+str(Expenses)+",经审核,申请通过--经办人:"+self.name+"("+self.title+")")
return
else:
if applicant is not None:
self.nextManager(applicant)
def nextManager(self,applicant):
self.nextOne.expensesJudge(applicant)
def setNextOne(self,manager):
self.nextOne = manager
def getName(self):
return self.name
def getTitle(self):
return self.title
最后对代码进行测试
if __name__ == '__main__':
#设置各部门信息
academyLeader = AcademyLeader("小红", "单位(学院)负责人")
functionalDepartmentLeader = FunctionalDepartmentLeader("小黄", "归口职能部门负责人")
schoolLeaderInCharge = SchoolLeaderInCharge("小绿", "分管校领导")
leaderInChargeOfFinance = LeaderInChargeOfFinance("小青", "主管财务校领导")
#为各部本指定下一级
academyLeader.setNextOne(functionalDepartmentLeader)
functionalDepartmentLeader.setNextOne(schoolLeaderInCharge)
schoolLeaderInCharge.setNextOne(leaderInChargeOfFinance)
#模拟申请者
applicant = Applicant("小源",5000)
applicant1 = Applicant("小橙",150000)
applicant.request(academyLeader)
applicant1.request(academyLeader)
//结果
#小源向小红(单位(学院)负责人)提交申请,金额为:5000
#小源申请金额为:5000,经审核,申请通过--经办人:小红(单位(学院)负责人)
#小橙向小红(单位(学院)负责人)提交申请,金额为:150000
#小橙申请金额为:150000,经审核,申请通过--经办人:小绿(分管校领导)
java
与python实现思想一致,不多做赘诉
Applicant
//申请人
public class Applicant {
public Applicant(String name, Integer expenses) {
this.name = name;
this.expenses = expenses;
}
//报销人
private String name ;
//报销费用
private Integer expenses;
public void request(AcademyLeader academyLeader){
System.out.println(this.name+"向"+academyLeader.getName()+"("+academyLeader.getTitle()+")提交申请,金额为:"+this.expenses);
academyLeader.expensesJudge(this);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getExpenses() {
return expenses;
}
public void setExpenses(Integer expenses) {
this.expenses = expenses;
}
}
Manager
//审批负责人接口
public interface Manager {
//金额不符合
boolean negativeNum(Integer num);
//费用判断
void expensesJudge(Applicant applicant);
//判断金额是否资金符合规矩,如不足,转交下一层
void nextManager(Applicant Applicant);
}
AcademyLeader
public class AcademyLeader implements Manager {
private String name;
private String title;
private Manager nextOne;
public AcademyLeader(String name, String title) {
this.name = name;
this.title = title;
}
@Override
public boolean negativeNum(Integer num) {
if(num < 0)
return true;
return false;
}
@Override
public void expensesJudge(Applicant applicant) {
if(negativeNum(applicant.getExpenses())){
System.out.println("金额不能为负");
}
if(applicant.getExpenses() < 50000 && applicant.getExpenses() > 0){
System.out.println(applicant.getName()+"申请金额为:"+applicant.getExpenses()+",经审核,申请通过--经办人:"+this.name+"("+this.title+")");
return;
}else {
nextManager(applicant);
}
}
@Override
public void nextManager(Applicant applicant) {
this.nextOne.expensesJudge(applicant);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Manager getNextOne() {
return nextOne;
}
public void setNextOne(Manager nextOne) {
this.nextOne = nextOne;
}
}
FunctionalDepartmentLeader
public class FunctionalDepartmentLeader implements Manager {
private String name;
private String title;
private Manager nextOne;
public FunctionalDepartmentLeader(String name, String title) {
this.name = name;
this.title = title;
}
@Override
public boolean negativeNum(Integer num) {
if(num < 0)
return true;
return false;
}
@Override
public void expensesJudge(Applicant applicant) {
if(negativeNum(applicant.getExpenses())){
System.out.println("金额不能为负");
}
if(applicant.getExpenses() < 100000 && applicant.getExpenses() >= 50000){
System.out.println(applicant.getName()+"申请金额为:"+applicant.getExpenses()+",经审核,申请通过--经办人:"+this.name+"("+this.title+")");
return;
}else {
nextManager(applicant);
}
}
@Override
public void nextManager(Applicant applicant) {
this.nextOne.expensesJudge(applicant);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Manager getNextOne() {
return nextOne;
}
public void setNextOne(Manager nextOne) {
this.nextOne = nextOne;
}
SchoolLeaderInCharge
public class SchoolLeaderInCharge implements Manager {
private String name;
private String title;
private Manager nextOne;
public SchoolLeaderInCharge(String name, String title) {
this.name = name;
this.title = title;
}
@Override
public boolean negativeNum(Integer num) {
if(num < 0)
return true;
return false;
}
@Override
public void expensesJudge(Applicant applicant) {
if(negativeNum(applicant.getExpenses())){
System.out.println("金额不能为负");
}
if(applicant.getExpenses() < 300000 && applicant.getExpenses() >= 100000){
System.out.println(applicant.getName()+"申请金额为:"+applicant.getExpenses()+",经审核,申请通过--经办人:"+this.name+"("+this.title+")");
return;
}else {
nextManager(applicant);
}
}
@Override
public void nextManager(Applicant applicant) {
this.nextOne.expensesJudge(applicant);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Manager getNextOne() {
return nextOne;
}
public void setNextOne(Manager nextOne) {
this.nextOne = nextOne;
}
}
LeaderInChargeOfFinance
public class LeaderInChargeOfFinance implements Manager {
private String name;
private String title;
private Manager nextOne;
public LeaderInChargeOfFinance(String name, String title) {
this.name = name;
this.title = title;
}
@Override
public boolean negativeNum(Integer num) {
if(num < 0)
return true;
return false;
}
@Override
public void expensesJudge(Applicant applicant) {
if(negativeNum(applicant.getExpenses())){
System.out.println("金额不能为负");
}
if(applicant.getExpenses() >= 300000){
System.out.println(applicant.getName()+"申请金额为:"+applicant.getExpenses()+",经审核,申请通过--经办人:"+this.name+"("+this.title+")");
return;
}else {
nextManager(applicant);
}
}
@Override
public void nextManager(Applicant applicant) {
this.nextOne.expensesJudge(applicant);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Manager getNextOne() {
return nextOne;
}
public void setNextOne(Manager nextOne) {
this.nextOne = nextOne;
}
}
代码测试
public class DutyTest {
public static void main(String[] args) {
AcademyLeader academyLeader = new AcademyLeader("小红", "单位(学院)负责人");
FunctionalDepartmentLeader functionalDepartmentLeader = new FunctionalDepartmentLeader("小黄", "归口职能部门负责人");
SchoolLeaderInCharge schoolLeaderInCharge = new SchoolLeaderInCharge("小绿", "分管校领导");
LeaderInChargeOfFinance leaderInChargeOfFinance = new LeaderInChargeOfFinance("小青", "主管财务校领导");
academyLeader.setNextOne(functionalDepartmentLeader);
functionalDepartmentLeader.setNextOne(schoolLeaderInCharge);
schoolLeaderInCharge.setNextOne(leaderInChargeOfFinance);
Applicant applicant = new Applicant("小源",5000);
Applicant applicant1 = new Applicant("小橙",150000);
applicant.request(academyLeader);
applicant1.request(academyLeader);
}
}
//结果
/*小源向小红(单位(学院)负责人)提交申请,金额为:5000
小源申请金额为:5000,经审核,申请通过--经办人:小红(单位(学院)负责人)
小橙向小红(单位(学院)负责人)提交申请,金额为:150000
小橙申请金额为:150000,经审核,申请通过--经办人:小绿(分管校领导)*/