[设计模式] 浅谈装饰模式

2024 年 4 月 29 日 星期一
/ ,
5

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

装饰模式

模式功能说明:它可以让你动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。

模式思路与原理

装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。

案例

// Component组件 -> Pizza接口
public interface Pizza {
    String getDescription();
    double getCost();
}

// ConcreteComponent具体组件 -> BasicPizza实现类
public class BasicPizza implements Pizza {
    @Override
    public String getDescription() {
        return "Basic Pizza";
    }

    @Override
    public double getCost() {
        return 5.0;
    }
}

// Decorator装饰者 - > CheeseDecorator
public class CheeseDecorator implements Pizza {
    private Pizza pizza;

    public CheeseDecorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Cheese";
    }

    @Override
    public double getCost() {
        return pizza.getCost() + 1.5;
    }
}

// Decorator装饰者 - > TomatoSauceDecorator
public class TomatoSauceDecorator implements Pizza {
    private Pizza pizza;

    public TomatoSauceDecorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDescription() {
        return pizza.getDescription() + ", Tomato Sauce";
    }

    @Override
    public double getCost() {
        return pizza.getCost() + 0.5;
    }
}

我们可以通过装饰者为Pizza添加新的行为,而无需修改Pizza接口或BasicPizza类。

总结

装饰模式的主要原则是开闭原则,即对扩展开放,对修改关闭。在装饰模式中,我们可以通过创建新的装饰类来增加新的行为,而无需修改现有的类。
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...