装饰器模式是一种结构型设计模式,它允许你在运行时为一个对象添加新的行为,同时不改变其原有的结构。
在软件开发中,有时候我们需要给一个对象动态地添加额外的功能,但又不希望修改其原有的代码或者创建大量的子类来实现。这时候,装饰器模式可以派上用场。
装饰器模式的核心思想是通过包装(Wrapping)已有的对象,来扩展其功能。它使用一种透明的方式,即客户端调用被装饰对象的方法,但同时加上了额外的行为。
让我给你一个简单的例子,假设我们有一个咖啡店,提供各种类型的咖啡。我们希望能够给咖啡添加额外的调料,比如牛奶、糖或者巧克力。使用装饰器模式,我们可以动态地为咖啡对象添加不同的调料,而不需要修改咖啡类本身。
下面是一个简单的Java示例,展示了如何使用装饰器模式为咖啡添加调料:
public interface Coffee { String getDescription(); double getCost(); } // 基本咖啡类 public class SimpleCoffee implements Coffee { @Override public String getDescription() { return "Simple Coffee"; } @Override public double getCost() { return 1.0; } } // 调料装饰器抽象类 public abstract class CoffeeDecorator implements Coffee { protected Coffee decoratedCoffee; public CoffeeDecorator(Coffee decoratedCoffee) { this.decoratedCoffee = decoratedCoffee; } @Override public String getDescription() { return decoratedCoffee.getDescription(); } @Override public double getCost() { return decoratedCoffee.getCost(); } } // 牛奶装饰器 public class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee decoratedCoffee) { super(decoratedCoffee); } @Override public String getDescription() { return super.getDescription() + ", Milk"; } @Override public double getCost() { return super.getCost() + 0.5; } } // 糖装饰器 public class SugarDecorator extends CoffeeDecorator { public SugarDecorator(Coffee decoratedCoffee) { super(decoratedCoffee); } @Override public String getDescription() { return super.getDescription() + ", Sugar"; } @Override public double getCost() { return super.getCost() + 0.3; } } // 使用示例 public class DecoratorPatternDemo { public static void main(String[] args) { Coffee simpleCoffee = new SimpleCoffee(); System.out.println(simpleCoffee.getDescription() + " | Cost: $" + simpleCoffee.getCost()); Coffee coffeeWithMilk = new MilkDecorator(simpleCoffee); System.out.println(coffeeWithMilk.getDescription() + " | Cost: $" + coffeeWithMilk.getCost()); Coffee coffeeWithMilkAndSugar = new SugarDecorator(coffeeWithMilk); System.out.println(coffeeWithMilkAndSugar.getDescription() + " | Cost: $" + coffeeWithMilkAndSugar.getCost()); } }
在这个示例中,Coffee接口定义了咖啡的基本行为。SimpleCoffee是具体的咖啡类,实现了Coffee接口。
CoffeeDecorator是一个抽象类,它扩展了Coffee接口,并持有一个Coffee对象作为被装饰的对象。MilkDecorator和SugarDecorator则是具体的装饰器类,它们继承了CoffeeDecorator并添加了额外的行为。
在使用示例中,我们首先创建了一个SimpleCoffee对象,然后通过装饰器为其添加牛奶和糖。每个装饰器类在原有的行为基础上增加了相应的调料和价格。
通过使用装饰器模式,我们可以动态地为一个对象添加新的行为,而无需修改原有对象的结构。这种方式非常灵活且可扩展,使得代码易于维护和扩展。
希望这个简单的例子能够帮助你理解装饰器模式的基本概念和应用。
本文固定URL:https://www.dotcpp.com/course/1369