装饰者模式如何优化Java代码,适用于什么样的场景?以及它的Java实现是怎样的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
装饰者模式是一种设计模式,它允许在不修改原始类代码的情况下动态地给对象添加新的职责(功能)。这种模式通过创建包装对象(装饰者)来包裹原有的对象(被装饰者),从而扩展其功能。装饰者模式适用于以下场景:
假设我们有一个简单的Coffee
接口和它的基本实现SimpleCoffee
,现在我们要动态地为咖啡添加不同的调料(如摩卡、奶泡等),而不改变原有咖啡类的结构。
// 咖啡接口
interface Coffee {
String getDescription();
double getCost();
}
// 基础咖啡类
class SimpleCoffee implements Coffee {
@Override
public String getDescription() {
return "Simple Coffee";
}
@Override
public double getCost() {
return 1.0;
}
}
// 装饰者抽象类
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee c) {
this.decoratedCoffee = c;
}
@Override
public abstract String getDescription();
@Override
public double getCost() {
return decoratedCoffee.getCost();
}
}
// 具体装饰者:摩卡
class Mocha extends CoffeeDecorator {
public Mocha(Coffee c) {
super(c);
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", Mocha";
}
@Override
public double getCost() {
return decoratedCoffee.getCost() + 0.5;
}
}
// 具体装饰者:奶泡
class Whip extends CoffeeDecorator {
public Whip(Coffee c) {
super(c);
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", Whip";
}
@Override
public double getCost() {
return decoratedCoffee.getCost() + 0.7;
}
}
public class DecoratorPatternDemo {
public static void main(String[] args) {
Coffee coffee = new SimpleCoffee();
System.out.println(coffee.getDescription() + " $" + coffee.getCost());
Coffee coffeeWithMocha = new Mocha(coffee);
System.out.println(coffeeWithMocha.getDescription() + " $" + coffeeWithMocha.getCost());
Coffee coffeeWithMochaAndWhip = new Whip(coffeeWithMocha);
System.out.println(coffeeWithMochaAndWhip.getDescription() + " $" + coffeeWithMochaAndWhip.getCost());
}
}
在这个例子中,CoffeeDecorator
是一个抽象装饰者,它持有一个Coffee
类型的引用,这样就可以在其基础上添加额外的功能。Mocha
和Whip
是具体的装饰者,它们扩展了咖啡的功能(描述和价格)。通过这种方式,我们可以根据需要动态地组合不同的装饰者,以构建具有不同特性的咖啡产品,而无需为每种可能的组合创建一个新的子类。