装饰器模式及应用【理论+代码】

装饰器模式(Decorator

Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种设计模式通过创建一个包装对象,即装饰器,来封装实际对象。

装饰器模式的主要组成:

组件接口:定义了对象的接口,可以给这些对象动态地添加职责。

具体组件:定义了将要接收附加责任的对象。

装饰器:持有一个组件对象的引用,并定义一个与组件接口一致的接口。

具体装饰器:负责给组件添加新的责任。

应用场景:

需要扩展一个类的功能。

动态地添加功能。

需要通过子类化来扩展功能,但又想避免使用继承带来的缺点。

  1. 定义一个coffer组件接口
java 复制代码
public interface Coffee {
    double getCost();
    String getDescription();
}

2.实现一个便宜的黑咖啡,一块钱一杯

java 复制代码
public class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
        return 1;
    }

    @Override
    public String getDescription() {
        return "Simple coffee";
    }
}

如何把这杯黑咖啡升值呢???当然我需要给它包装,这个时候装饰器设计模式来了,让便宜点黑咖啡山鸡变凤凰!!!

  1. 装饰器抽象类来了,它可以将任何咖啡包装成你高攀不起的样子!!!
java 复制代码
public abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;

	//这和代理模式的区别,这里的类是通过构造器传过来的
    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }

    @Override
    public double getCost() {
        return decoratedCoffee.getCost();
    }

    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
}
  1. 不信?那我来实现个卡布奇诺
java 复制代码
public class Cappuccino Decorator extends CoffeeDecorator {
    public Cappuccino (Coffee coffee) {
        super(coffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 31;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", with milk";
    }
}
  1. 出来吧!包装版卡布奇诺
java 复制代码
public class CoffeeShop {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        System.out.println(coffee.getCost()); // 1
        System.out.println(coffee.getDescription()); // Simple coffee

        Coffee cappuccino = new Cappuccino (coffee);
        System.out.println(cappuccino .getCost()); // 32
        System.out.println(cappuccino .getDescription()); // Simple coffee, with milk
     }
}

那么,这样做有啥好处呢?我用类继承也可以实现啊

装饰器模式提供了一种灵活的替代继承的方法来扩展对象的行为。通过添加新的装饰器类,可以轻松地为现有对象添加新功能,而不需要修改原有代码。

灵活性:可以在运行时动态地添加或移除装饰器,从而改变对象的行为。这使得程序更加灵活,能够适应不断变化的需求。

低耦合性:装饰器模式通过组合而非继承来扩展功能,减少了类之间的依赖关系。这有助于降低系统的耦合度,使得代码更容易维护和扩展。

责任分离:装饰器模式将系统的不同功能分离开来,每个装饰器类负责特定的功能扩展。这种责任分离有助于降低系统的复杂性,使得各个部分更容易理解和管理。

支持开闭原则:装饰器模式支持开闭原则,即对扩展开放,对修改关闭。可以通过添加新的装饰器来扩展系统功能,而不需要修改现有代码。

相关推荐
老鼠只爱大米8 小时前
Java设计模式之外观模式(Facade)详解
java·设计模式·外观模式·facade·java设计模式
闲人编程8 小时前
Python的抽象基类(ABC):定义接口契约的艺术
开发语言·python·接口·抽象类·基类·abc·codecapsule
qq_172805598 小时前
Go 语言结构型设计模式深度解析
开发语言·设计模式·golang
vx_dmxq2118 小时前
【微信小程序学习交流平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·微信小程序·小程序·idea
9号达人8 小时前
优惠系统演进:从"实时结算"到"所见即所得",前端传参真的鸡肋吗?
java·后端·面试
AAA简单玩转程序设计8 小时前
Java进阶小妙招:ArrayList和LinkedList的"相爱相杀"
java
lkbhua莱克瓦248 小时前
集合进阶8——Stream流
java·开发语言·笔记·github·stream流·学习方法·集合
20岁30年经验的码农8 小时前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
okseekw8 小时前
Java 中的注释与关键字的初步学习
java
雾岛听蓝8 小时前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记