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

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

示例1:日志处理系统

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

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:支付处理系统

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

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);
    }
}

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

相关推荐

  1. 设计模式责任模式示例

    2024-04-09 06:10:05       36 阅读
  2. 设计模式-责任模式

    2024-04-09 06:10:05       56 阅读
  3. 设计模式——责任模式

    2024-04-09 06:10:05       56 阅读
  4. 设计模式责任模式

    2024-04-09 06:10:05       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 06:10:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 06:10:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 06:10:05       87 阅读
  4. Python语言-面向对象

    2024-04-09 06:10:05       96 阅读

热门阅读

  1. wpf ResourceDictionary的MergedDictionaries

    2024-04-09 06:10:05       43 阅读
  2. rust实现一个post小程序

    2024-04-09 06:10:05       41 阅读
  3. 设计模式:生活中的责任链模式

    2024-04-09 06:10:05       39 阅读
  4. 【Python】OPC UA 服务器与客户端的实现

    2024-04-09 06:10:05       39 阅读
  5. 【使用 Qt 实现计算器】

    2024-04-09 06:10:05       30 阅读
  6. WKWebView生成PDF

    2024-04-09 06:10:05       34 阅读
  7. 算力服务器租用的费用包含哪些方面?

    2024-04-09 06:10:05       31 阅读
  8. python实现假设检验-z检验

    2024-04-09 06:10:05       36 阅读
  9. 国内镜像源拉取Ubuntu,并实现网络配置

    2024-04-09 06:10:05       40 阅读
  10. Python的学习之路

    2024-04-09 06:10:05       39 阅读
  11. RFID详解

    2024-04-09 06:10:05       38 阅读
  12. C语言的数组

    2024-04-09 06:10:05       33 阅读
  13. 速盾:游戏cdn什么意思

    2024-04-09 06:10:05       41 阅读
  14. html实现登录界面

    2024-04-09 06:10:05       34 阅读