设计模式:责任链模式示例

news/2024/5/19 15:19:23 标签: 设计模式, 责任链模式, java

责任链模式可以应用于多种场景,下面是几个不同场景的例子,每个例子都包括完整的代码。

示例1:日志处理系统

在日志处理系统中,日志消息可以根据其严重性(错误、警告、信息)被不同级别的日志处理器处理。

java">abstract class Logger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger) {
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message) {
        if (this.level <= level) {
            write(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }

    abstract protected void write(String message);
}

class ConsoleLogger extends Logger {
    public ConsoleLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Standard Console::Logger: " + message);
    }
}

class ErrorLogger extends Logger {
    public ErrorLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.err.println("Error Console::Logger: " + message);
    }
}

class FileLogger extends Logger {
    public FileLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("File::Logger: " + message);
    }
}

public class ChainPatternDemo {
    private static Logger getChainOfLoggers() {
        Logger errorLogger = new ErrorLogger(Logger.ERROR);
        Logger fileLogger = new FileLogger(Logger.DEBUG);
        Logger consoleLogger = new ConsoleLogger(Logger.INFO);

        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);

        return errorLogger;
    }

    public static void main(String[] args) {
        Logger loggerChain = getChainOfLoggers();

        loggerChain.logMessage(Logger.INFO, "This is an information.");
        loggerChain.logMessage(Logger.DEBUG, "This is a debug level information.");
        loggerChain.logMessage(Logger.ERROR, "This is an error information.");
    }
}

示例2:支付处理系统

在一个支付处理系统中,一个支付请求可以通过多种支付方式进行处理。

java">abstract class PaymentHandler {
    protected PaymentHandler successor;

    public void setSuccessor(PaymentHandler successor) {
        this.successor = successor;
    }

    public abstract void handlePayment(PaymentRequest request);
}

class PaymentRequest {
    private double amount;

    public PaymentRequest(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }
}

class PaypalHandler extends PaymentHandler {
    @Override
    public void handlePayment(PaymentRequest request) {
        if (request.getAmount() < 1000) {
            System.out.println("Paypal processed $" + request.getAmount());
        } else if (successor != null) {
            successor.handlePayment(request);
        }
    }
}

class CreditCardHandler extends PaymentHandler {
    @Override
    public void handlePayment(PaymentRequest request) {
        if (request.getAmount() < 5000) {
            System.out.println("Credit Card processed $" + request.getAmount());
        } else if (successor != null) {
            successor.handlePayment(request);
        }
    }
}

class BankTransferHandler extends PaymentHandler {
    @Override
    public void handlePayment(PaymentRequest request) {
        System.out.println("Bank Transfer processed $" + request.getAmount());
    }
}

public class PaymentChainDemo {
    public static void main(String[] args) {
        PaymentHandler paypal = new PaypalHandler();
        PaymentHandler creditCard = new CreditCardHandler();
        PaymentHandler bankTransfer = new BankTransferHandler();

        paypal.setSuccessor(creditCard);
        creditCard.setSuccessor(bankTransfer);

        PaymentRequest request = new PaymentRequest(450);
        paypal.handlePayment(request);

        request = new PaymentRequest(1200);
        paypal.handlePayment(request);

        request = new PaymentRequest(6500);
        paypal.handlePayment(request);
    }
}

责任链模式在软件设计中非常通用,并且可以在许多不同的场景中找到应用。这些示例展示了责任链模式在处理具有不同处理级别或条件的请求时的灵活性和可扩展性。在实际应用中,责任链模式可以帮助我们创建更加模块化和可管理的代码,但也需要注意不要过度使用,避免不必要的复杂性。


http://www.niftyadmin.cn/n/5477547.html

相关文章

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

【Unity渲染】渲染管线原理

整理自B站UPKerry佬的视频【【教程】技术美术入门&#xff1a;渲染管线概述】 https://www.bilibili.com/video/BV1Q54y1G7v3/?share_sourcecopy_web&vd_source7e6249c05fba6efe32e8867373f75917 应用阶段 、几何阶段顶点处理、光栅化、片元处理、输出合并 应用阶段是CUP…

matlab画图 横坐标为标注

set(gca, xtick, 1:2:6); % set(gca,xticklabel,{0%,25%,50%,75%,100%,75%,50%,25%,0%},FontSize,8);参考&#xff1a;坐标自定义标签

el-cascader 级联选择器 省市区动态获取

根据获取省市区码的接口拿到当前的省市区编码&#xff0c;再将编码传到获取该地区数据的接口&#xff0c;拿到返回值传回父组件。 1.通过lazy开启动态加载&#xff0c;通过lazyload来设置加载数据源的方法&#xff0c;对节点数据添加是否为叶子节点的标志leaf&#xff0c;如果…

【Unity实战100例】Unity入门小地图位置同步(第一第三人称)

unity小地图制作包括第一人称控制器和第三人称控制器 目录 一.选择合适自身的人称控制器 二.小地图制作

【测试篇】Selenium + Java环境搭建

文章目录 Selenium Java环境搭建配置系统环境变量PATH验证环境是否搭建成功常见问题&解决办法 Selenium Java环境搭建 Java版本最低要求为8&#xff0c;这里默认大家都下载好了Java。&#x1f606; 下载chrome浏览器&#xff08;点我下载&#xff09; 观察chrome版本。…

一口气说完Pandas数据结构简介

接下来我将对 pandas 的基本数据结构进行快速、非全面的概述&#xff0c;以帮助您入门。有关数据类型、索引、轴标签和对齐的基本行为适用于所有对象。首先&#xff0c;导入 NumPy 并将 pandas 加载到您的命名空间中&#xff1a; import numpy as npimport pandas as pd从根本…

textcnn做多分类

textcnn.py代码文件 import jieba import pickle import numpy as np from tensorflow.keras import Model, models from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing import sequence from tensorflow.keras.layers import…