装饰模式

模式定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。

模式结构

模式结构

Component:组件对象的接口,可以给这些对象动态地增加职责。
ConcreteComponet:具体的组建对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。
ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰对象添加的功能。

代码实现

//我们用颜色装饰下宝马车
public interface Car {
    void detail();
}

public class BMW implements Car {
    public void detail() {
        System.out.println("宝马");
    }
}

public class Decorator implements Car {
    private Car car;
    public Decorator(Car car) {
        this.car = car;
    }
    public void detail() {
        car.detail();
    }
}

public class YellowCar extends Decorator {

    public YellowCar(Car car) {
        super(car);
    }

    @Override
    public void detail() {
        System.out.print("黄色");
        super.detail();
    }
}

public class BlackCar extends Decorator {
    public BlackCar(Car car) {
        super(car);
    }

    @Override
    public void detail() {
        System.out.print("黑色");
        super.detail();
    }
}

public class Client {
    public static void main(String[] args) {
        Car yellowCar =new YellowCar(new Decorator(new BMW()));
        yellowCar.detail();

        Car blackCar = new BlackCar(new Decorator(new BMW()));
        blackCar.detail();
    }
}

模式的优缺点

优点

  1. 比继承更灵活
    从为对象添加功能的角度来看,装饰模式比继承更灵活。继承时静态的,而且一旦继承所有子类都有一样的功能。而装饰模式采用把功能分离到每个装饰器当中,然后通过对象组合的方式,在运行时动态地组合功能。

  2. 更容易复用功能
    装饰模式把一些列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,使实现装饰器变得简单,更重要的是这样有利于装饰器功能的复用,可以给一个对象添加多个同样的装饰器,也可以把一个装饰器用来装饰不同的对象。

  3. 简化高层定义
    装饰模式可以通过组合装饰器方式,为对象增添任意多的功能。因此在进行高层定义的时候,不用把所有的功能都定义出来,而是定义最基本的就可以了,可以在需要使用的时候,组合相应的装饰器来完成需要的功能。

缺点

  1. 会产生许多细力度的对象。

思考

模式本质:动态组合。

开发中的应用场景

  1. 如果需要在不影响其他对象的情况下,以动态、透明的方式给对象增加职责,可以失忆哦那个装饰模式,这几乎就是装饰模式的主要功能。

  2. 如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 复杂的奖金计算## 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂...
    七寸知架构阅读 9,575评论 4 67
  • 一、模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途...
    端木轩阅读 3,446评论 0 0
  • 1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承...
    今晚打肉山阅读 2,593评论 0 0
  • 0x01 前言   装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变...
    菩提树下成魔阅读 3,077评论 0 0
  • 1. 概述 demo地址,欢迎star 2. 问题 3. 解决方案 装饰器模式: 动态地给一个对象添加一些额外的...
    barry阅读 1,891评论 0 0