美文网首页
装饰者模式

装饰者模式

作者: 梦星夜雨 | 来源:发表于2021-01-05 10:11 被阅读0次

定义

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。特点是开发-闭合原则。

适用场景

  1. 需要扩展一个类的功能,或给一个类添加附加职责。
  2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
  3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

代码实现

  1. 新建一个抽象类Beverage,作为所有类的超类。子类必须要实现cost()方法。
public abstract class Beverage {
    String description = "Unknown Beverage";
  
    public String getDescription() {
        return description;
    }
 
    public abstract double cost();
}
  1. CoffeeBeverage继承Beverage 类,并实现cost()方法。同理还有TeaBeverage类,代码这里就不展示。
public class CoffeeBeverage extends Beverage{

    public CoffeeBeverage() {
        description = "Coffee Beverage";
    }
    @Override
    public double cost() {
        return 22.0;
    }
}
  1. CondimentDecorator类同样继承Beverage类,作为调味品的父类。所有的调料装饰者都必须重新实现getDescription()方法这样才能够用递归的方式来得到所选饮料的整体描述。
public abstract class CondimentDecorator extends Beverage{
    public abstract String getDescription();
}
  1. Milk作为一款调味品继承CondimentDecorator抽象类,实现了cost()和getDescription()方法。Whip和Coconut两个类相同实现。
public class Milk extends CondimentDecorator{

    private Beverage beverage;
    public Milk(Beverage beverage) {
        this.beverage = beverage;

        getDescription();
    }
    
    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Milk";
    }

    @Override
    public double cost() {
        return 3.0+beverage.cost();
    }

}
  1. 最后是测试类,主要是装饰者的调用方式。
public class Decoratortest{

    public static void main(String[] args) {
        Beverage beverage = new CoffeeBeverage();
        beverage = new Milk(beverage);
        beverage = new Whip(beverage);
        System.out.println("Coffee cost: "+beverage.cost()+",  "+beverage.getDescription());

        Beverage beverage2 = new TeaBeverage();
        beverage2 = new Milk(beverage2);
        beverage2 = new Coconut(beverage2);
        System.out.println("Tea cost: "+beverage2.cost()+",  "+beverage2.getDescription());
    }
}

最终结果。

Coffee cost: 27.0, Coffee Beverage, Milk, Whip
Tea cost: 20.0, Tea Beverage, Milk, Coconut

优点

  1. 装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰者可以提供比继承更多的灵活性。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点

  1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂,造成类的爆炸。

为什么使用抽象类不使用接口?
因为接口必须实现所有方法,而抽象类只需要实现抽象方法,有些方法是可以使用父类的。

相关文章

  • 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    目录 什么是装饰者模式 普通示例 装饰者模式示例 类图关系 装饰者模式使用场景 装饰者模式优点 装饰者模式缺点 什...

  • 装饰者模式

    装饰者模式 装饰者模式和适配器模式对比 装饰者模式 是一种特别的适配器模式 装饰者与被装饰者都要实现同一个接口,主...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式-装饰者模式

    装饰者模式概念: 装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关...

  • java - 装饰者模式

    装饰者模式 装饰者模式:动态将责任添加到对象上。如果需要扩展功能,装饰者提供了比继承更有弹性的解决方案。装饰者模式...

  • 设计模式之装饰者模式(Decorator Pattern)

    What: 装饰者模式又名包装(Wrapper)模式。装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提...

  • 装饰者(Decorator)模式

    装饰者(Decorator)模式装饰模式又名包装(Wrapper)模式。装饰模式是继承关系的一个替代方案。装饰模式...

  • 2、装饰者模式

    装饰者模式 一、基本概念 二、结构 三、案例1、装饰者模式案例2、JavaIO中使用装饰者模式 四、总结 一、基本...

  • PHP的设计模式-装饰者模式

    装饰者模式 装饰者模式 装饰者模式类似蛋糕,有草莓味、奶酪等种类,但是它们的核心都是蛋糕。 不断地将对象添加装饰的...

  • 设计模式 | 装饰者模式及典型应用

    前言 本文的主要内容: 介绍装饰者模式 示例 源码分析装饰者模式的典型应用Java I/O 中的装饰者模式spri...

网友评论

      本文标题:装饰者模式

      本文链接:https://www.haomeiwen.com/subject/alolfktx.html