设计模式之装饰器 Decorator

简介: 设计模式之装饰器 Decorator

在原本的东西的基础之上加上一层装饰

当需要在原来的类上进行包装的时候,按照传统的方式需要一层层的继承,这样显然不方便。

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰器设计模式的必备要素:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

下面我们看一下代码实现:

首先,需要定义一个抽象构件,即接口,这里面要放我们想要实现的方法规范

public interface Animal {
    void getDesc();
    void getPrice();
}

然后 定义一个具体构件,实现抽象构件,在之后我们通过装饰器来装饰具体构件

public class Cat implements Animal{
    @Override
    public void getDesc() {
        System.out.println("这是猫!");
    }
    @Override
    public void getPrice() {
        System.out.println("不要钱");
    }
}

定义抽象的装饰器,这里持有抽象构件的引用,并通过构造器传入引用,这样达到增强的作用

public abstract class Decorator implements Animal{
    protected Animal animal;
    public Decorator(Animal animal){
        this.animal = animal;
    }
    @Override
    public void getDesc() {
        animal.getDesc();
        System.out.println("加了装饰的猫");
    }
    @Override
    public void getPrice() {
        animal.getPrice();
        System.out.println("3块钱");
    }
}

可以看到,在以上代码中,我们赋予了引用具体的对象。并且在实现抽象构件的方法中,调用了我们传入的对象的方法,并且在这之后去做一些其他的功能,这样就达到了不修改代码,对原来的功能进行增强的目的

最后,我们看一下具体的构件装饰器

public class WhiteCatDecorator extends Decorator{
    public WhiteCatDecorator(Animal animal) {
        super(animal);
    }
    @Override
    public void getPrice() {
        super.getPrice();
        System.out.println("20块钱");
    }
    @Override
    public void getDesc() {
        super.getDesc();
        System.out.println("这是白猫");
    }
}

具体的逻辑就是提供构造器入口赋值,然后对原来的方法进行增强

目录
相关文章
|
9月前
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
18 0
|
3天前
|
设计模式 存储 SQL
设计模式——结构型模式(适配器,桥接,过滤器,组合,装饰器,外观,享元,代理)(2)
设计模式——结构型模式(适配器,桥接,过滤器,组合,装饰器,外观,享元,代理)
|
3天前
|
设计模式 存储 前端开发
设计模式——结构型模式(适配器,桥接,过滤器,组合,装饰器,外观,享元,代理)(1)
设计模式——结构型模式(适配器,桥接,过滤器,组合,装饰器,外观,享元,代理)
|
2月前
|
设计模式 Java
Java 设计模式:混合、装饰器与组合的编程实践
【4月更文挑战第27天】在面向对象编程中,混合(Mixins)、装饰器(Decorators)和组合(Composition)是三种强大的设计模式,用于增强和扩展类的功能。
34 1
|
2月前
|
设计模式 算法 Java
【设计模式】美团三面:你连装饰器都举不出例子?
【设计模式】美团三面:你连装饰器都举不出例子?
24 0
|
2月前
|
设计模式 缓存 测试技术
python的装饰器与设计模式中的装饰器模式
python的装饰器与设计模式中的装饰器模式
|
2月前
|
设计模式 人工智能 移动开发
认真学习设计模式之装饰者模式(Decorator Pattern)
写在前言 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。
33 0
|
2月前
|
设计模式 Java 数据库连接
设计模式与面向对象编程:举例说明在Java中应用工厂模式的场景,并编写一个简单的工厂模式实现。编写一个Java装饰器,用于添加日志记录功能到现有方法上。
设计模式与面向对象编程:举例说明在Java中应用工厂模式的场景,并编写一个简单的工厂模式实现。编写一个Java装饰器,用于添加日志记录功能到现有方法上。
28 0
|
9月前
|
设计模式 Java 关系型数据库
【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
47 0
|
设计模式 Java
Java设计模式-装饰器模式(Decorator)
Java设计模式-装饰器模式(Decorator)