Java设计模式-装饰模式

一、定义

        指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

二、优点

1. 装饰模式与继承都是要扩展对象的功能,装饰模式是继承的有力补充,比继承灵活,且装饰模式可以提供比继承更多的灵活性,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用;

2. 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰类及这些装饰类的排列组合,从而实现不同的行为,可以实现不同效果;

3. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”;

4. 有效的把类的核心职责和装饰功能分开了,而且可以去除相关类中的重复装饰逻辑。

三、缺点

1、使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,同时还将产生很多具体装饰类。这些装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度;
2、 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

四、代码

@PostMapping("saveOrder")
public void saveOrder(@RequestBody Order order) {
    // 装饰器模式需要放入被修饰的对象(SpringUtil引用hutool)
    OrderServiceImpl bean = SpringUtil.getBean(OrderServiceImpl.class);
    OrderDecorator decorator = new OrderDecorator(bean);
    decorator.saveOrder(order);
}
// 定义接口
public interface OrderService {

    void saveOrder(Order order);

}
@Service
public class OrderServiceImpl implements OrderService {

    @Override
    public void saveOrder(Order order) {
        System.out.println("保存order方法........");
    }

}
// 定义接口的装饰器
public class OrderDecorator implements OrderService {

    private OrderService orderService;

    public OrderDecorator(OrderService orderService) {
        this.orderService = orderService;
    }

    @Override
    public void saveOrder(Order order) {
        // 实现 OrderService 前 先对改方法做修饰
        System.out.println("保存order方法前对改方法的装饰");
        orderService.saveOrder(order);
    }

}


 

你可能感兴趣的:(设计模式,设计模式)