责任链模式


责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,每个处理者决定是否处理请求以及是否将请求传递给下一个处理者。在快递系统中,责任链模式可以用于处理物流中的不同环节,例如包裹的分拣、配送等。

以下是一个简化的Java示例,模拟一个快递系统中的责任链模式。假设有三个处理者:分拣员、配送员和签收员。每个处理者负责处理特定的任务,并且请求会按照责任链的顺序依次经过它们。

java
Copy code
// 请求类
class Package {
    private String description;

    public Package(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

// 处理者接口
interface Handler {
    void handleRequest(Package pkg);
}

// 具体处理者1 - 分拣员
class SortingHandler implements Handler {
    private Handler nextHandler;

    public SortingHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Package pkg) {
        if (pkg.getDescription().contains("fragile")) {
            System.out.println("Sorting Handler: Handling a fragile package.");
            // 分拣员处理完成后,将请求传递给下一个处理者
            nextHandler.handleRequest(pkg);
        } else {
            System.out.println("Sorting Handler: Package is not fragile. Skipping sorting.");
        }
    }
}

// 具体处理者2 - 配送员
class DeliveryHandler implements Handler {
    private Handler nextHandler;

    public DeliveryHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Package pkg) {
        System.out.println("Delivery Handler: Delivering the package.");
        // 配送员处理完成后,将请求传递给下一个处理者
        nextHandler.handleRequest(pkg);
    }
}

// 具体处理者3 - 签收员
class SignHandler implements Handler {
    @Override
    public void handleRequest(Package pkg) {
        System.out.println("Sign Handler: Package signed and delivered successfully.");
    }
}

// 客户端代码
public class DeliverySystem {
    public static void main(String[] args) {
        // 构建责任链
        Handler signHandler = new SignHandler();
        Handler deliveryHandler = new DeliveryHandler(signHandler);
        Handler sortingHandler = new SortingHandler(deliveryHandler);

        // 模拟一个包裹
        Package pkg = new Package("Fragile item");

        // 将请求传递给责任链的第一个处理者
        sortingHandler.handleRequest(pkg);
    }
}


在这个示例中,分拣员、配送员和签收员分别实现了Handler接口,每个处理者负责处理特定类型的请求。在客户端代码中,创建了一个责任链,将请求传递给责任链的第一个处理者。责任链中的每个处理者都有一个指向下一个处理者的引用,当处理者完成任务后,它可以选择将请求传递给下一个处理者。这种方式使得责任链模式非常灵活,易于扩展和维护。


2 / 2

User
那要怎么调用呢,给我一个完整的案例
ChatGPT
在上述的责任链模式的示例中,我们已经创建了一个简单的快递系统场景,其中包含分拣员、配送员和签收员三个处理者。现在,我将提供一个完整的案例,演示如何调用责任链来处理快递包裹。

java
Copy code
// 请求类
class Package {
    private String description;

    public Package(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

// 处理者接口
interface Handler {
    void handleRequest(Package pkg);
}

// 具体处理者1 - 分拣员
class SortingHandler implements Handler {
    private Handler nextHandler;

    public SortingHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Package pkg) {
        if (pkg.getDescription().contains("fragile")) {
            System.out.println("Sorting Handler: Handling a fragile package.");
            // 分拣员处理完成后,将请求传递给下一个处理者
            nextHandler.handleRequest(pkg);
        } else {
            System.out.println("Sorting Handler: Package is not fragile. Skipping sorting.");
        }
    }
}

// 具体处理者2 - 配送员
class DeliveryHandler implements Handler {
    private Handler nextHandler;

    public DeliveryHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Package pkg) {
        System.out.println("Delivery Handler: Delivering the package.");
        // 配送员处理完成后,将请求传递给下一个处理者
        nextHandler.handleRequest(pkg);
    }
}

// 具体处理者3 - 签收员
class SignHandler implements Handler {
    @Override
    public void handleRequest(Package pkg) {
        System.out.println("Sign Handler: Package signed and delivered successfully.");
    }
}

// 客户端代码
public class DeliverySystem {
    public static void main(String[] args) {
        // 构建责任链
        Handler signHandler = new SignHandler();
        Handler deliveryHandler = new DeliveryHandler(signHandler);
        Handler sortingHandler = new SortingHandler(deliveryHandler);

        // 模拟多个包裹
        Package fragilePackage = new Package("Fragile item");
        Package normalPackage = new Package("Non-fragile item");

        // 将请求传递给责任链的第一个处理者
        sortingHandler.handleRequest(fragilePackage);
        System.out.println("--------------");
        sortingHandler.handleRequest(normalPackage);
    }
}


在这个案例中,我们创建了两个包裹对象,一个标记为"fragile",另一个标记为"non-fragile"。然后,我们将这两个包裹对象分别传递给责任链的第一个处理者,即分拣员(SortingHandler)。由于第一个包裹是"fragile",所以它会被分拣员处理,并且请求会按照责任链的顺序传递给下一个处理者,最终由签收员处理。对于第二个包裹,由于它不是"fragile",所以分拣员会跳过处理,直接打印"Package is not fragile. Skipping sorting."。整个过程演示了责任链模式中请求如何在处理者之间传递的机制。

你可能感兴趣的:(設計模式,责任链模式)