装饰器模式详解(定义实现及应用场景)

装饰器模式详解(定义实现及应用场景)-mikechen

装饰器模式是常见的Java设计模式用途非常的广,下面我就重点详解装饰器模式的实现与应用场景@mikechen

装饰器模式定义

装饰器模式是一种结构型设计模式,其目的是通过动态添加对象的功能来扩展其行为,而无需使用子类化的方式。

 

装饰器模式角色

在这种模式中,有四个主要的角色:

装饰器模式详解(定义实现及应用场景)-mikechen

1.Component

定义了被装饰对象的接口或抽象类,也是所有具体组件的共同父类。

2.ConcreteComponent

实现了Component接口的具体对象,是被装饰对象的基本实现。

3.Decorator

保持一个指向Component对象的引用,并定义与Component接口一致的接口。

Decorator还可以维护一个装饰器链,以便动态地添加和删除装饰器对象。

4.ConcreteDecorator

通过添加一些额外的行为来扩展Component对象的功能,它们实现了Decorator接口并且具有被装饰对象的引用。

 

装饰器模式实现

在装饰器模式中,有一个核心组件,也称为“被装饰对象”,通常是一个接口或抽象类。

装饰器是一个包装器,它接收被装饰对象作为参数,并添加了一些额外的行为。

下面是一个使用Java语言实现装饰器模式的示例,来加深对装饰器模式的理解。

假设我们有一个简单的咖啡店,需要为每杯咖啡添加不同的配料,我们可以使用装饰器模式来动态添加配料,而无需为每种可能的配料创建一个子类。

// Component
interface Coffee {
    double getCost();
    String getDescription();
}

// ConcreteComponent
class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
        return 1.0;
    }
    @Override
    public String getDescription() {
        return "Simple coffee";
    }
}

// Decorator
abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;
    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }
    public double getCost() {
        return decoratedCoffee.getCost();
    }
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
}

// ConcreteDecorator
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }
    public double getCost() {
        return super.getCost() + 0.5;
    }
    public String getDescription() {
        return super.getDescription() + ", with milk";
    }
}

// Client code
Coffee coffee = new SimpleCoffee();
coffee = new MilkDecorator(coffee);
System.out.println(coffee.getCost()); // Output: 1.5
System.out.println(coffee.getDescription()); // Output: Simple coffee, with milk

在这个例子中:

  • Coffee接口是被装饰对象;
  • SimpleCoffee是ConcreteComponent;
  • CoffeeDecorator是Decorator;
  • MilkDecorator是ConcreteDecorator;
  • MilkDecorator添加了牛奶的价格和描述,而CoffeeDecorator维护一个指向被装饰对象的引用,并使用被装饰对象的getCost()和getDescription()方法来实现自己的行为。

 

装饰器模式应用场景

以下是一些装饰器模式适用的场景:

1.动态地为对象添加功能

如果你需要在不影响现有代码的情况下,动态地为一个对象添加额外的行为或功能,那么装饰器模式是非常有用的。

例如:你可以使用装饰器来添加日志记录、缓存或安全性检查等功能。

2.多个独立的扩展功能

如果你需要为一个对象添加多个不相关的扩展功能,那么使用装饰器模式可以避免创建大量的子类。

3.避免修改已有代码

在某些情况下,你可能不希望修改已有代码,但仍需要为其添加新功能。

例如,在第三方库中添加自己的功能,而不影响库的原始代码。

以上就是装饰器模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法