1、已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5 万元以下(不包括5 万元)的采购单,副董事长可以审批5 万元至10万元(不包括10 万元)的采购单,董事长可以审批10 万元至50 万元(不包括50万元)的采购单,50 万元及以上的采购单就需要开会讨论决定。请使用职责链模式对上述过程进行设计,绘制相应类图并使用Java语言编程实现。该有的功能代码都要有,不要省略表示。类图用图表示。
根据您提供的信息,我将为您设计一个基于职责链模式的采购审批系统。职责链模式是一种行为型设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理该请求为止。在这个场景中,不同级别的主管人员将根据采购金额的不同来审批采购单。
类图设计
首先,我们需要定义一个抽象处理者(AbstractHandler)类,它将作为所有审批者的基类。这个类将包含一个方法来处理请求,并有一个指向下一个处理者的引用。
classDiagram
class AbstractHandler {
-Handler successor
+void setSuccessor(Handler successor)
+void handleRequest(Request request)
}
class Director {
+void handleRequest(Request request)
}
class ViceChairman {
+void handleRequest(Request request)
}
class Chairman {
+void handleRequest(Request request)
}
class Discussion {
+void handleRequest(Request request)
}
AbstractHandler <|-- Director
AbstractHandler <|-- ViceChairman
AbstractHandler <|-- Chairman
AbstractHandler <|-- Discussion
Java代码实现
接下来,我们将使用Java语言来实现这个设计。
// 抽象处理者类
abstract class AbstractHandler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
// 主任类
class Director extends AbstractHandler {
@Override
public void handleRequest(Request request) {
if (request.getAmount() < 50000) {
System.out.println("Director approves the request.");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 副董事长类
class ViceChairman extends AbstractHandler {
@Override
public void handleRequest(Request request) {
if (request.getAmount() >= 50000 && request.getAmount() < 100000) {
System.out.println("Vice Chairman approves the request.");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 董事长类
class Chairman extends AbstractHandler {
@Override
public void handleRequest(Request request) {
if (request.getAmount() >= 100000 && request.getAmount() < 500000) {
System.out.println("Chairman approves the request.");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 讨论类
class Discussion extends AbstractHandler {
@Override
public void handleRequest(Request request) {
if (request.getAmount() >= 500000) {
System.out.println("The request needs to be discussed in a meeting.");
}
}
}
// 请求类
class Request {
private double amount;
public Request(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
// 客户端测试
public class Client {
public static void main(String[] args) {
Handler director = new Director();
Handler viceChairman = new ViceChairman();
Handler chairman = new Chairman();
Handler discussion = new Discussion();
director.setSuccessor(viceChairman);
viceChairman.setSuccessor(chairman);
chairman.setSuccessor(discussion);
Request request1 = new Request(30000);
Request request2 = new Request(70000);
Request request3 = new Request(200000);
Request request4 = new Request(600000);
director.handleRequest(request1);
director.handleRequest(request2);
director.handleRequest(request3);
director.handleRequest(request4);
}
}
在这个实现中,我们创建了四个处理者类:Director
、ViceChairman
、Chairman
和Discussion
,它们都继承自AbstractHandler
类。每个类都实现了handleRequest
方法,根据采购金额的不同来决定是否批准请求或者将请求传递给链中的下一个处理者。最后,我们在Client
类中创建了请求对象,并设置了处理者之间的链,然后逐个处理这些请求。14567891011121314151617181920
职责链模式(Chain of Responsibility Pattern)1 | 设计模式 为请求创建接收者对象链。 |
职责链模式(Chain of Responsibility Pattern)2 | UML类图分析 详细代码实现。 |
Java日志框架:slf4j作用及其实现原理3 | 架构示例 展示责任链模式应用。 |
责任链模式(Chain Of Responsibility Design Pattern)4 | 解耦请求发送接收 让多个对象处理请求。 |
职责链模式(Chain of Responsibility)5 | 避免耦合 多个对象处理请求。 |
责任链模式的主要优点6 | 降低耦合度 对象无需知道请求处理者。 |
职责链模式(Chain of Responsibility Pattern)1 | 职责链模式 为请求创建接收者对象链,解耦请求发送者和接收者。 |
抽象处理者(Handler)角色14 | 抽象处理者 定义处理请求接口,可设定和返回对下家的引用。 |
Servlet 过滤器17 | Servlet 过滤器 可用于Servlet编程,实现责任链模式。 |
Client 类15 | 客户端 在职责链模式中设置责任链并发送请求。 |
主任9 | 采购审批角色 主任负责审批5万元以下的采购单。 |
副董事长9 | 采购审批角色 副董事长负责审批5万元至10万元的采购单。 |
董事长9 | 采购审批角色 董事长负责审批10万元至50万元的采购单。 |
开会讨论9 | 决策机制 50万元及以上的采购单需要通过开会讨论决定。 |