Dotcpp  >  编程教程  >  结构型模式(Structural Patterns)  >  装饰器模式

装饰器模式

点击打开在线编译器,边学边练

装饰器模式是一种结构型设计模式,它允许你在运行时为一个对象添加新的行为,同时不改变其原有的结构。

在软件开发中,有时候我们需要给一个对象动态地添加额外的功能,但又不希望修改其原有的代码或者创建大量的子类来实现。这时候,装饰器模式可以派上用场。

装饰器模式

装饰器模式的核心思想是通过包装(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

上一课:

组合模式

下一课:

外观模式

Dotcpp在线编译      (登录可减少运行等待时间)