디자인 패턴의 책임 사슬 패턴에 대한 참고 사항
설명하다
디자인 패턴 학습-책임 패턴 사슬의 글쓰기 방법을 기록합니다. 사용된 JDK 버전은 1.8 버전입니다.
책임의 사슬
의도 : 여러 개체에 요청을 처리할 수 있는 기회를 제공하여 요청 발신자와 수신자 간의 결합을 방지합니다. 이러한 개체는 체인으로 연결되며 요청은 개체가 처리할 때까지 체인을 따라 전달됩니다.
구조 :
안에:
- 핸들러는 요청 처리를 위한 인터페이스를 정의하며 (선택 사항) 후속 체인을 구현합니다.
- ConcreteHandler는 자신이 담당하는 요청을 처리하고, 후속 작업에 액세스할 수 있으며, 요청이 처리될 수 있으면 이를 처리하고, 그렇지 않으면 요청을 후속 작업에 전달합니다.
- 클라이언트는 체인의 구체적인 처리기(ConcreteHandler) 개체에 요청을 제출합니다.
적용 가능성:
- 요청을 처리할 수 있는 개체는 여러 개 있으며, 요청을 처리하는 개체는 런타임 시 자동으로 결정됩니다.
- 수신자를 명시적으로 지정하지 않고 여러 개체 중 하나에 요청을 제출하려고 합니다.
- 요청을 처리할 수 있는 개체 집합은 동적으로 지정되어야 합니다.
목차
책임 사슬 패턴 예제 클래스 다이어그램
책임 사슬 패턴의 예를 구현하려면 이 UML 클래스 다이어그램을 사용하세요.
탈퇴 요청 유형
package com.example.deesign_patterns.responsibility;
//请假条类
public class LeaveRequest {
//姓名
private String name;
//请假天数
private int num;
//请假内容
private String content;
public LeaveRequest(String name, int num, String content) {
this.name = name;
this.num = num;
this.content = content;
}
public String getName() {
return name;
}
public int getNum() {
return num;
}
public String getContent() {
return content;
}
}
추상 핸들러 클래스
package com.example.deesign_patterns.responsibility;
//抽象处理者类
public abstract class Handler {
protected final static int NUM_ONE=1;
protected final static int NUM_THREE=3;
protected final static int NUM_SEVEN=7;
//该领导处理的请求天数区间
private int numStart;
private int numEnd;
//声明后续者(声明上级领导)
private Handler nextHandler;
public Handler(int numStart){
this.numStart=numStart;
}
public Handler(int numStart,int numEnd){
this.numStart=numStart;
this.numEnd=numEnd;
}
//设置上级领导对象
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
//各级领导处理请假条的方法
protected abstract void handleLeave(LeaveRequest leave);
//提交请求条
public final void submit(LeaveRequest leave){
//该领导进行审批
this.handleLeave(leave);
//判断是否有上级领导且该领导能否处理
if(this.nextHandler!=null&&leave.getNum()>this.numEnd){
//提交给上级领导进行审批
this.nextHandler.submit(leave);
}else {
System.out.println("流程结束!");
}
}
}
그룹리더 카테고리
package com.example.deesign_patterns.responsibility;
//小组长类(具体的处理者)
public class GroupLeader extends Handler{
//定义小组长批准天数为1天
public GroupLeader() {
super(0,Handler.NUM_ONE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName()+"请假"+leave.getNum()+"天,"+leave.getContent()+"。");
System.out.println("小组长审批:同意");
}
}
부서장 수업
package com.example.deesign_patterns.responsibility;
//部门经理类(具体的处理者)
public class Manager extends Handler{
//部门经理批准天数为1-3天
public Manager() {
super(Handler.NUM_ONE,Handler.NUM_THREE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName()+"请假"+leave.getNum()+"天,"+leave.getContent()+"。");
System.out.println("部门经理审批:同意");
}
}
총책임자
package com.example.deesign_patterns.responsibility;
//总经理类(具体的处理者)
public class GeneralManager extends Handler{
//总经理批准天数为3-7天
public GeneralManager() {
super(Handler.NUM_THREE,Handler.NUM_SEVEN);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName()+"请假"+leave.getNum()+"天,"+leave.getContent()+"。");
System.out.println("总经理审批:同意");
}
}
테스트 클래스
package com.example.deesign_patterns.responsibility;
//测试类
public class Client {
public static void main(String[] args) {
//创建一个请假条对象
LeaveRequest leave=new LeaveRequest("小明",7,"身体不适");
//创建各级领导对象
GroupLeader groupLeader=new GroupLeader();
Manager manager=new Manager();
GeneralManager generalManager=new GeneralManager();
//设置处理者链
groupLeader.setNextHandler(manager);
manager.setNextHandler(generalManager);
//小明提交请假申请
groupLeader.submit(leave);
}
}
혜택:
- 개체 간의 결합을 줄입니다. 이 패턴은 요청 발신자와 수신자 간의 결합을 줄입니다.
- 향상된 시스템 확장성. 열기 및 닫기 원칙을 충족하기 위해 필요에 따라 새로운 요청 처리 클래스를 추가할 수 있습니다.
- 객체에 책임을 할당하는 유연성이 향상되었습니다. 작업 흐름이 변경되면 체인 내의 구성원이 동적으로 변경되거나 순서가 수정될 수 있고, 책임도 동적으로 추가되거나 삭제될 수 있습니다.
- 책임 사슬은 객체 간의 연결을 단순화합니다. 객체는 후속 객체에 대한 참조만 유지하면 되고 다른 모든 핸들러에 대한 참조는 유지하지 않아도 되므로 수많은 if 또는 if...else 문을 사용할 필요가 없습니다.
- 책임을 공유합니다. 각 클래스는 자신이 처리해야 할 작업만 처리하면 되고, 처리되지 않은 작업은 다음 개체로 전달되어 완료됩니다. 각 유형의 책임 범위가 명확하게 정의되어 클래스의 단일 책임 원칙에 부합합니다.
결점:
- 모든 요청이 처리된다는 보장은 없습니다. 요청에는 명확한 수신자가 없기 때문에 처리된다는 보장이 없으며 요청이 체인 끝에 도달할 때까지 처리되지 않을 수 있습니다.
- 더 긴 책임 체인에 비해 요청 처리에는 여러 처리 개체가 포함될 수 있으며 시스템 성능은 어느 정도 영향을 받습니다.
- 책임체인 설정의 합리성은 클라이언트가 보장해야 하므로 클라이언트의 복잡성이 증가하며, 순환호출 등 책임체인의 잘못된 설정으로 인해 시스템 오류가 발생할 수 있습니다.