首页 > 其他分享 >责任链模式

责任链模式

时间:2023-06-25 15:56:46浏览次数:37  
标签:member loginName String 模式 AbstractHandler 责任 loginPass public

责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。

这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

这种类型的设计模式属于行为型模式

使用登录例子:

  • 成员定义
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class Member {
    private String loginName;
    private String loginPass;
    private String roleName;

    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }

    public String getLoginName() {
        return loginName;
    }

    public String getLoginPass() {
        return loginPass;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    @Override
    public String toString() {
        return "Member{" +
                "loginName='" + loginName + '\'' +
                ", loginPass='" + loginPass + '\'' +
                '}';
    }
}
  • 抽象处理类
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public abstract class AbstractHandler {
    protected AbstractHandler chain;

    public void next(AbstractHandler handler) {
        this.chain = handler;
    }

    public abstract void doHandle(Member member);
}

  • 实现抽象类1
package org.kouhao.design.patterns.责任链模式;

/**
 * 非空校验类
 *
 * @author admin
 */
public class ValidateHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        if (member.getLoginName() == null ||
                member.getLoginPass() == null) {
            System.out.println("用户名或者密码为空");
            return;
        }
        System.out.println("用户名和密码校验成功,可以往下执行");
        chain.doHandle(member);
    }
}
  • 实现抽象类2
package org.kouhao.design.patterns.责任链模式;

/**
 * 登录校验
 *
 * @author admin
 */
public class LoginHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        System.out.println("登录成功!");
        member.setRoleName("管理员");
        chain.doHandle(member);
    }
}
  • 实现抽象类3
package org.kouhao.design.patterns.责任链模式;

/**
 * 权限校验
 *
 * @author admin
 */
public class AuthHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        if (!"管理员".equals(member.getRoleName())) {
            System.out.println("您不是管理员,没有操作权限");
            return;
        }
        System.out.println("您是管理员,允许操作");
    }
}
  • 责任链组装
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class MemberService {
    public void login(String loginName, String loginPass) {
        AbstractHandler validateHandler = new ValidateHandler();
        AbstractHandler loginHandler = new LoginHandler();
        AbstractHandler authHandler = new AuthHandler();

        validateHandler.next(loginHandler);
        loginHandler.next(authHandler);

        validateHandler.doHandle(new Member(loginName, loginPass));
    }
}
  • 客户端
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        new MemberService().login("admin", "Admin@123");
    }
}
  • 输出

用户名和密码校验成功,可以往下执行
登录成功!
您是管理员,允许操作

责任链模式和建造者模式结合使用

负责组装链式结构的角色是MemberService,当链式结构较长时,MemberService的工作会非常烦琐,并且MemberService的代码相对臃肿,且后续更改处理者或消息类型时,都必须在MemberService中进行修改,不符合开闭原则。

标签:member,loginName,String,模式,AbstractHandler,责任,loginPass,public
From: https://www.cnblogs.com/kouhao/p/17503109.html

相关文章

  • VMware中切换命令行和桌面模式
    在虚拟机中,一般通过以下步骤来切换命令行和桌面模式:进入虚拟机中的操作系统。按下Ctrl+Alt+F1键,在虚拟机中切换到命令行模式。输入用户名和密码,登录到命令行模式下的操作系统。在命令行中执行需要的操作,例如安装软件、配置网络等。当需要返回到桌面模式时,可以按下Ctrl+Alt+F......
  • WPF入门教程系列二十九 ——DataGrid使用示例MVVM模式(7)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 接上文WPF......
  • 委托及观察者模式
    委托委托(delegate)是一种特殊的类型(class),它可以被认为是一个可以拥有函数引用的类,它的声明规定了它能够持有的函数引用的函数形式,同时它可以存储多个函数引用,并通过自己的方法调用所有注册在它身上的方法(发布者)。理解了观察者模式就理解了委托它的特点在于:委托类型的定义方......
  • vue项目本地启动history路由模式刷新页面404
    背景:之前一直用hash模式,改成history模式后刷新页面404解决:vue.config.js中publicPath:"/"如果是线上服务则还需要后端修改一些配置,见链接点击查看......
  • 大端模式与小端模式简介
    转载文章:《数据在内存中存储的方式:大端模式与小端模式》什么是大端模式,什么是小端模式?所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低......
  • JavaScript中最好的明暗模式主题切换
    了解如何使用JavaScript、CSS自定义属性、本地存储和系统设置为您的网站构建终极主题Toggle™️。无需框架!我曾经不同意浅色和深色模式切换。“切换开关是用户系统偏好设置!”我会天真地感叹,选择让prefers-color-schemeCSS媒体查询控制我个人网站上的主题。没有切换。没有选择......
  • Ubuntu开机默认进入命令行模式/用户图形界面(转)
    一、开机默认进入命令行模式  #输入命令: sudosystemctlset-defaultmulti-user.target #重启: reboot 要进入图形界面,只需要输入命令startx从图形界面切换回命令行:ctrl+alt+F7 二、开机默认进入图形用户界面  #输入命令: ......
  • Java 设计模式实战系列—策略模式
    从优惠打折活动说起电商平台为了增加销量经常搞一些活动,比如618、双十一,还有一些节假日活动,根据销量的变化又经常更新不同的活动。最开始为了增加销量,全场都六折://打六折publicBigDecimalsixDiscount(BigDecimalamount){BigDecimaldiscount=BigDecimal.valueOf(0......
  • 设计模式之单例模式
    介绍单例模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。单例模式的八种方式1.饿汉式(静态常量)2.饿汉式(静态代码块)3.懒汉式(线程不安全)4.懒汉式(线程安全,同步方法)5.懒汉式(线程安全,同步代码块)6.......
  • pg基本基本概念——模式、表、空间、用户间的关系
    表空间用于定义数据库对象在物理存储设备上的位置,不特定于某个单独的数据库。数据库是数据库对象的物理集合,而schema则是数据库内部用于组织管理数据库对象的逻辑集合,schema名字空间之下则是各种应用程序会接触到的对象,比如表、索引、数据类型、函数、操作符等。角色(用户)则是......