如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。

考虑一个简化的餐厅订单处理系统,其中包括服务员(Waiter)、厨师(Chef)和收银员(Cashier)。订单从服务员开始,然后传递给厨师,最后到达收银员。订单对象包含了顾客的点菜信息。

订单类(Order):

public class Order {
    private String customerName;
    private String dishName;

    public Order(String customerName, String dishName) {
        this.customerName = customerName;
        this.dishName = dishName;
    }

    public String getCustomerName() {
        return customerName;
    }

    public String getDishName() {
        return dishName;
    }
}

责任链模式:服务员、厨师和收银员

// 处理订单的接口
public interface OrderHandler {
    void handleOrder(Order order);
}

// 服务员
public class Waiter implements OrderHandler {
    private OrderHandler nextHandler;

    public Waiter(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleOrder(Order order) {
        System.out.println("Waiter takes order from " + order.getCustomerName());
        if (nextHandler != null) {
            nextHandler.handleOrder(order);
        }
    }
}

// 厨师
public class Chef implements OrderHandler {
    private OrderHandler nextHandler;

    public Chef(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleOrder(Order order) {
        System.out.println("Chef prepares dish: " + order.getDishName());
        if (nextHandler != null) {
            nextHandler.handleOrder(order);
        }
    }
}

// 收银员
public class Cashier implements OrderHandler {
    @Override
    public void handleOrder(Order order) {
        System.out.println("Cashier processes payment for " + order.getDishName());
    }
}

装饰者模式:为订单添加额外信息

// 装饰者抽象类
public abstract class OrderDecorator implements OrderHandler {
    protected OrderHandler nextHandler;

    public OrderDecorator(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public abstract void handleOrder(Order order);
}

// 装饰者:添加打包信息
public class PackagingDecorator extends OrderDecorator {
    public PackagingDecorator(OrderHandler nextHandler) {
        super(nextHandler);
    }

    @Override
    public void handleOrder(Order order) {
        System.out.println("Packaging decorator adds packaging for " + order.getDishName());
        if (nextHandler != null) {
            nextHandler.handleOrder(order);
        }
    }
}

客户端代码:

public class Client {
    public static void main(String[] args) {
        // 构建责任链:服务员 -> 厨师 -> 装饰者(打包) -> 收银员
        OrderHandler cashier = new Cashier();
        OrderHandler packagingDecorator = new PackagingDecorator(cashier);
        OrderHandler chef = new Chef(packagingDecorator);
        OrderHandler waiter = new Waiter(chef);

        // 创建订单
        Order order = new Order("John", "Pizza");

        // 提交订单给责任链
        waiter.handleOrder(order);
    }
}

在这个例子中,责任链模式帮助我们实现了订单处理的链式调用,而装饰者模式允许我们动态地为订单添加额外的信息(比如打包)。通过这样的设计,我们可以更容易地扩展系统、添加新的处理者或者装饰者,而不必修改现有的类。

Waiter 的构造函数中传递的 nextHandlerChef,而 Chef 的构造函数中传递的是 PackagingDecorator。

相关推荐

  1. 特殊设计单例模式

    2023-12-29 19:12:03       15 阅读
  2. css使用选择器选择特定模式元素

    2023-12-29 19:12:03       19 阅读
  3. 揭秘:抽象接口之间区别意义

    2023-12-29 19:12:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 19:12:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 19:12:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 19:12:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 19:12:03       20 阅读

热门阅读

  1. android RecyclerView1.3.2与NestedScrollingParent的变化

    2023-12-29 19:12:03       41 阅读
  2. AI训练师常用的ChatGPT通用提示词模板

    2023-12-29 19:12:03       37 阅读
  3. js中三种URI编码方式比较

    2023-12-29 19:12:03       39 阅读
  4. GO语言工具函数库--Lancet

    2023-12-29 19:12:03       35 阅读
  5. php5.6安装mongo扩展

    2023-12-29 19:12:03       42 阅读
  6. 使用conda在Windows上建立虚拟环境

    2023-12-29 19:12:03       40 阅读
  7. 分享一波测试面试题(偏银行、信贷)

    2023-12-29 19:12:03       33 阅读
  8. 信息安全管理实践

    2023-12-29 19:12:03       42 阅读
  9. vue中的事件绑定的过程

    2023-12-29 19:12:03       34 阅读
  10. 备份文件..

    2023-12-29 19:12:03       33 阅读
  11. Docker构建zookeeper集群

    2023-12-29 19:12:03       40 阅读