当前位置: 首页 > article >正文

链式设计模式:装饰模式,职责链模式

1.什么是链式设计模式

        将多个对象或类串联起来,自上向下/由外向内遍历,直到满足条件或遍历结束,这种模式我们称为链式模式。

2.装饰模式

        不改变对象接口的情况下,动态的给一个对象添加一些额外的功能。

2.1核心概念

        Component:定义一个抽象的接口或类,所有的具体组件类和装饰器类都实现或继承这个接口或类。

        ConcreteComponent:具体的组件类,实现了Component接口。

        Decorator:装饰器类,也实现了Component接口,并持有一个Component对象的引用。通过委托调用Component对象的方法,并在必要时添加额外的行为。

        ConcreteDecorator:具体的装饰器类,继承自Decorator类,并在其中添加新的行为或职责。

2.2优点

        1)动态扩展功能:允许在运动时动态的为对象添加新的功能。

        2)符合开闭原则:添加新功能时不需要改原有代码。

        3)透明性:装饰对象和被装饰对象可以相互替换,对客户透明。

        4)灵活性:耦合度低,也可以通过不同装饰器实现不同组合。

2.3弊端

        1)复杂性增加:可能过度设计,创建多个装饰器类,增加代码复杂度。

        2)不易调试:多层嵌套的话可能导致调试困难。

2.4简单代码演示

public abstract class Role {

    public abstract String getName();

}
public class Roles extends Role {

    String name = "小明";

    @Override
    public String getName() {
        return name;
    }

}
public abstract class DressUp extends Role {

    Role role;

    public abstract String getName();

}
public class Clothes extends DressUp {
    Role role;

    public Clothes(Role role){
        this.role = role;
    }

    @Override
    public String getName() {
        return role.getName()+"穿衣服";
    }

}
    Role role;

    public Pants(Role role){
        this.role=role;
    }
    @Override
    public String getName() {
        return role.getName()+"穿裤子";
    }

}
public class Test {
    public static void main(String[] args) {

        Roles roles = new Roles();
        System.out.println(roles.getName());

        Clothes clothes = new Clothes(roles);
        System.out.println(clothes.getName());

        Pants pants = new Pants(roles);
        System.out.println(pants.getName());

        Pants pants1 = new Pants(clothes);
        System.out.println(pants1.getName());


    }
}

测试结果:

3.职责链模式

        使多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合关系。

3.1核心概念

        Handler(处理者):定义一个处理请求的接口,通常包含一个指向下一个处理者的引用。

        ConcreteHandler(具体处理者):实现处理者接口,具体处理请求。每个具体处理者决定是否处理请求,以及是否将请求传递给链中的下一个处理者。

        Client(客户端):创建处理者对象,并将它们组织成一条链。

3.2优点

        1)动态配置:允许在运动时动态的为对象添加或删除处理者。

        2)符合开闭原则:添加新功能时不需要改原有代码。

        3)责任明确:每个处理者只负责处理特定请求。

        4)多级处理:请求可以在多个处理者之间传递。

        4)灵活性:发送者和处理者之间解耦。

3.3弊端

        1)性能问题:如果职责链过长,请求可能需要经过多个处理者,增加了处理时间。

        2)调试困难:请求在多个处理者之间传递,可能导致调试和追踪请求处理过程的难度增加。

        


http://www.kler.cn/a/429852.html

相关文章:

  • js:正则表达式
  • PyCharm文档管理
  • 前端开发:HTML常见标签
  • JavaScript 学习总结
  • 备战蓝桥杯 队列和queue详解
  • 计算机网络之---公钥基础设施(PKI)
  • 一根网线如何用软路由给手机、电脑分配设置不同IP
  • 从watch、watchEffect、useEffect原理到vue、react响应原理
  • keepalived 各模式设置
  • 实时数据开发|Flink状态计算 有状态VS无状态,区别和优劣
  • NanoLog起步笔记-7-log解压过程初探
  • 什么是反向代理?作用、原理和实例详解
  • 反向代理-缓存篇
  • ubuntu22.04 使用可以用的镜像源获取你要的镜像
  • 数据结构与算法学习笔记----树与图的深度优先遍历
  • MACOS M1/M2芯片 Homebrew 安装教程
  • FastAPI解决跨域报错net::ERR_FAILED 200 (OK)
  • REDMI瞄准游戏赛道,推出小屏平板
  • 单片机C51--笔记8-STC89C51RC/RD-IIC协议
  • 太速科技-614-基于6U VPX FPGA VU9P 4路100G、32路10Gbps的光纤卡
  • 力扣第95题 不同的二叉搜索树 II
  • 【WebRTC】Android SDK使用教学
  • 如何使用靜態IP代理?【詳細教程】
  • 云原生周刊:在Docker上部署大语言模型
  • scala 身份证号码
  • hping3-网络工具