装饰器模式是常见的Java设计模式用途非常的广,下面我就重点详解装饰器模式的实现与应用场景@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
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》