디자인 패턴의 책임 사슬 패턴에 대한 참고 사항

설명하다

디자인 패턴 학습-책임 패턴 사슬의 글쓰기 방법을 기록합니다. 사용된 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 문을 사용할 필요가 없습니다.
  • 책임을 공유합니다. 각 클래스는 자신이 처리해야 할 작업만 처리하면 되고, 처리되지 않은 작업은 다음 개체로 전달되어 완료됩니다. 각 유형의 책임 범위가 명확하게 정의되어 클래스의 단일 책임 원칙에 부합합니다.

결점:

  • 모든 요청이 처리된다는 보장은 없습니다. 요청에는 명확한 수신자가 없기 때문에 처리된다는 보장이 없으며 요청이 체인 끝에 도달할 때까지 처리되지 않을 수 있습니다.
  • 더 긴 책임 체인에 비해 요청 처리에는 여러 처리 개체가 포함될 수 있으며 시스템 성능은 어느 정도 영향을 받습니다.
  • 책임체인 설정의 합리성은 클라이언트가 보장해야 하므로 클라이언트의 복잡성이 증가하며, 순환호출 등 책임체인의 잘못된 설정으로 인해 시스템 오류가 발생할 수 있습니다.

추천

출처blog.csdn.net/weixin_48040732/article/details/131358048