【デザインパターン】——15、Chain of Responsibility Pattern

(15)Chain of Responsibility Model

Chain of Responsibility Patternは、チェーン内の各ノードをオブジェクトと見なし、各ノードはさまざまな要求の処理を担当し、次のノードオブジェクトを内部で自動的に維持します。責任チェーンモードにより、デカップリングが十分に実現され、オブジェクトノードが自身の責任を負います。

1.責任連鎖パターン設計の原則

抽象ハンドラー:要求処理メソッドを定義し、次の処理オブジェクトノードへの参照を維持します。

具象ハンドラー(ConcreateHandler):要求を処理します。

2.簡単な例

ログインのビジネスロジックでは、ユーザー情報の検証、判断、認証などを行う必要があり、責任連鎖モードを利用することで、各プロセッサが連携してログインビジネスの処理を完了することができます。

public abstract class Handler {
    
    
    protected Handler chain;
//    负责将当前获取对象置为全局对象
    public void next(Handler handler){
    
    
        this.chain = handler;
    }
//   自己的业务逻辑处理
    public abstract void doHandler(Member member);
}
public class ValidHandler extends Handler {
    
    
    @Override
    public void doHandler(Member member) {
    
    
        if(null == member.getUsername() || null ==member.getPassword()){
    
    
            System.out.println("用户名或密码为空!");
            return;
        }
        System.out.println("用户名密码校验成功!");
        chain.doHandler(member);
    }
}
public class LoginHandler extends Handler {
    
    
    @Override
    public void doHandler(Member member) {
    
    
        System.out.println("登录成功!");
        member.setInfo("管理员");
        chain.doHandler(member);
    }
}
public class AuthHandler extends Handler {
    
    
    @Override
    public void doHandler(Member member) {
    
    
        if(!"管理员".equals(member.getInfo())){
    
    
            System.out.println("您不是管理员,没有操作权限!");
            return;
        }
        System.out.println("欢迎管理员!");
    }
}
public class Member {
    
    
    private String username;
    private String password;
    private String info;

    public Member(String username, String password, String info) {
    
    
        this.username = username;
        this.password = password;
        this.info = info;
    }
    //getter,setter
}
public class MemberService {
    
    
    public void login(String username,String password){
    
    
        ValidHandler validHandler = new ValidHandler();
        LoginHandler loginHandler = new LoginHandler();
        AuthHandler authHandler = new AuthHandler();

//        责任链模式的业务处理顺序,分别指定各处理器的当前对象
        validHandler.next(loginHandler);
        loginHandler.next(authHandler);

        validHandler.doHandler(new Member(username,password,"管理员"));
    }
}
public class Client {
    
    
    public static void main(String[] args) {
    
    
        MemberService memberService = new MemberService();
        memberService.login("lsk","123");
    }
}
画像-20210314121201123

3.責任連鎖モデルの評価

責任の連鎖モードは、要求と処理の分離を実現すると同時に、柔軟に処理でき、動的に拡張できます。責任の連鎖が長いと、処理時間が長くなり、システムが複雑になる可能性もあります。

おすすめ

転載: blog.csdn.net/qq_40589204/article/details/118054636