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

设计模式----链式设计

设计模式中使用链式设计的有两个,装饰模式和职责链模式

装饰模式

定义:

动态的给一个对象添加一些额外的职责

结构:

它包括四部分

Component(接口) :定义了一个对象接口,可以给这些对象动态地添加职责。这个接口是所有具体组件和装饰器的超类。

ConcreteComponent(具体组件) :实现了Component接口,是被装饰的类。

Decorator(装饰器抽象类) :装饰器抽象类,持有一个指向 Component 对象的引用,并实现了 Component 接口中定义的所有方法。装饰器可以在其方法中调用这些被装饰对象的方法,并可以在调用这些方法之前或之后添加额外的行为。

ConcreteDecorator(具体装饰器类) :具体的装饰器类,继承自 Decorator 类,并向 Component 对象添加额外的职责。具体装饰器类可以添加多个职责,也可以链式地调用多个装饰器。

具体实现:

// Component 接口
interface Component {
    void operation();
}

// ConcreteComponent 类,具体被装饰的对象
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent operation");
    }
}

// Decorator 类,装饰器抽象类
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}

// ConcreteDecorator 类,具体的装饰器类
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorA added behavior");
    }
}

class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        addedState();
        super.operation();
    }

    private void addedState() {
        System.out.println("ConcreteDecoratorB added state");
    }
}

// 使用示例
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();

        // 链式装饰
        component = new ConcreteDecoratorA(component);
        component = new ConcreteDecoratorB(component);

        // 执行操作
        component.operation();
    }
}

职责链模式

定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构:

它包括三部分

1、Handler 接口或抽象类:定义了一个处理请求的接口。这个接口声明了一个处理请求的方法,该方法通常接受一个参数(即请求),并返回一个结果(例如,表示请求是否被处理的布尔值,或者一个更复杂的响应对象)。此外,接口或抽象类还可以包含一个指向下一个处理者的引用(即链中的下一个节点)。

2、ConcreteHandler 类:实现了 Handler 接口或继承自抽象类的具体处理者。每个 ConcreteHandler 对象都可以处理某些特定类型的请求,或者根据某些条件将请求传递给链中的下一个处理者。

3、Client 类:创建处理者链,并向链的头部发送请求。Client 类不知道哪个处理者最终会处理请求,它只是简单地将请求发送给链的起始点

具体实现:

// Handler 接口
interface Handler {
    void handleRequest(String request);
    Handler getNextHandler();
    void setNextHandler(Handler nextHandler);
}

// ConcreteHandler 类,具体处理者
class ConcreteHandler1 implements Handler {
    private Handler nextHandler;

    @Override
    public void handleRequest(String request) {
        if (canHandle(request)) {
            // 处理请求
            System.out.println("ConcreteHandler1 handled: " + request);
        } else {
            // 如果不能处理,传递给下一个处理者
            if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        }
    }

    private boolean canHandle(String request) {
        // 判断是否能处理该请求的逻辑
        return request.startsWith("A");
    }

    @Override
    public Handler getNextHandler() {
        return nextHandler;
    }

    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
}

// 另一个具体处理者,类似地实现 Handler 接口
class ConcreteHandler2 implements Handler {
    // ...(与 ConcreteHandler1 类似的实现)
}

// Client 类
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();

        // 设置处理者链
        handler1.setNextHandler(handler2);

        // 发送请求
        handler1.handleRequest("A-type request"); // ConcreteHandler1 会处理
        handler1.handleRequest("B-type request"); // ConcreteHandler2 会处理(如果它的 canHandle 方法匹配)
    }
}

链式形成区别:

在装饰模式中,链式的形成主要是通过子类调用父类的接口或方法来实现的,但这并不是严格意义上的“链式”连接,因为装饰类并没有将请求传递给另一个装饰类,而是直接在被装饰对象上执行操作,但是装饰类可以嵌套使用,即一个装饰类可以装饰另一个装饰类,从而形成一个装饰链,这种嵌套使用的方式在某种程度上也体现了链式的思想。

在职责链模式中,链式的形成则是通过每个处理者(Handler)维护一个对下一个处理者的引用来实现的。具体来说: 每个处理者都实现了相同的接口或继承了相同的抽象类,定义了处理请求的方法。 处理者内部会维护一个对下一个处理者的引用(通常称为successor),以便在无法处理请求时将其传递给下一个处理者。这种机制实现了请求的发送者和接收者之间的解耦,增加了系统的灵活性和可扩展性。


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

相关文章:

  • 代码随想录 字符串 test5
  • windows配置 Conda 使用阿里云镜像源
  • Qt Quick 和 Qt Designer
  • Jupyter notebook中运行dos指令运行方法
  • 【Redis】Redis 集群中节点之间如何通信?
  • VLANIF配置之区别(Differences in VLANIF Configuration)
  • 如何在 JavaScript 中设置定时器?
  • 2024-09 GESP C++ 一级试题及答案解析
  • 使用Jackson库的ObjectMapper类将Java对象转换为JSON格式
  • 数据结构之五:排序
  • ubuntu18.04升级到20.04
  • Web后端开发技术:RESTful 架构详解
  • 聚观早报 | 华为Mate 70开售;小米15 Ultra影像大升级
  • HDFS的架构优势与基本操作
  • vivado中,generate output product 和Create HDL wrapper的作用
  • 数据分析power bi负值条形图
  • 大模型Qwen面试内容整理-模型部署与优化
  • 代码随想录第40天
  • [MySQL基础](三)SQL--图形化界面+DML
  • 使用 Temporal 管理和调度 Couchbase SQL 脚本的实际例子
  • React第十四节useState使用详解差异
  • MongoDB 建模调优change stream实战
  • 【html网页页面010】html+css制作茶品牌文创网页制作含视频元素(7页面附效果及源码)
  • 华为TaurusDB与GaussDB:信创改造的“降本提效”之路
  • npm、yarn、pnpm 设置最新国内镜像源(附官方镜像源和最新阿里源),以及 nrm 的使用教程
  • 数据结构--树和二叉树