美文网首页
装饰者(Decorator)模式

装饰者(Decorator)模式

作者: xandone | 来源:发表于2019-01-09 18:17 被阅读12次

装饰者(Decorator)模式
装饰模式又名包装(Wrapper)模式。装饰模式是继承关系的一个替代方案。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
举一个生活中的例子,
去奶茶店点奶茶,奶茶的种类有很多种,珍珠奶茶、绿茶、红茶...然后每一种茶都可以有不同的配置方案,比如常见的:去冰、加糖、打包等。
那么,假设每种类型的奶茶都是一个实体类,可以在每种奶茶包装不同的属性(配置方案)。
1.创建父类
这里设定为接口,每种奶茶都实现了该接口

public interface Tea {
    void describe();
}

describe()函数简单的模拟该tea包含的属性。

2.定义每种奶茶的实体类

/**
 * 珍珠奶茶
 */
public class PearlTea implements Tea {

    @Override
    public void describe() {
        System.out.print("珍珠奶茶\t");
    }
}

/**
 * 红茶
 */
public class BlackTea implements Tea {

    @Override
    public void describe() {
        System.out.print("红茶\t");
    }
}

/**
 * 绿茶
 */
public class GreenTea implements Tea {

    @Override
    public void describe() {
        System.out.print("绿茶\t");
    }
}

3.定义装饰基础类
处理装饰者公共逻辑部分,在构造函数中,传入需要包装的Tea对象,对其进行“装饰操作”

/**
 * tea装饰基础类
 */
public abstract class CommenTeaDecorate implements Tea {

    protected Tea tea;

    public CommenTeaDecorate(Tea tea) {
        this.tea = tea;
    }

    @Override
    public void describe() {
        tea.describe();
    }
}

4.装饰属性的实现类

/**
 * 去冰
 */
public class NoIceTeaDecorate extends CommenTeaDecorate {

    public NoIceTeaDecorate(Tea tea) {
        super(tea);
    }

    @Override
    public void describe() {
        super.describe();
        System.out.print("去冰\t");
    }
}

/**
 * 加糖
 */
public class SugarTeaDecorate extends CommenTeaDecorate {
    
    public SugarTeaDecorate(Tea tea) {
        super(tea);
    }

    @Override
    public void describe() {
        super.describe();
        System.out.print("加糖\t");
    }

}

/**
 * 打包
 */
public class PackTeatDecorate extends CommenTeaDecorate {
    public PackTeatDecorate(Tea tea) {
        super(tea);
    }

    @Override
    public void describe() {
        super.describe();
        System.out.print("打包\t");
    }
}

5.调用方法
例子1:分别包装三种类型的奶茶,

    PearlTea pearlTea = new PearlTea();
    GreenTea greenTea = new GreenTea();
    BlackTea blackTea = new BlackTea();

    NoIceTeaDecorate noIceTeaDecorate = new NoIceTeaDecorate(pearlTea);
    SugarTeaDecorate sugarTeaDecorate = new SugarTeaDecorate(greenTea);
    PackTeatDecorate packTeatDecorate = new PackTeatDecorate(blackTea);
    
    noIceTeaDecorate.describe();
    sugarTeaDecorate.describe();
    packTeatDecorate.describe();

打印:

珍珠奶茶    去冰  
绿茶      加糖  
红茶      打包

例子2:针对一种奶茶多重属性包装,

    PearlTea pearlTea = new PearlTea();
    NoIceTeaDecorate noIceTeaDecorate = new NoIceTeaDecorate(pearlTea);
    SugarTeaDecorate sugarTeaDecorate = new SugarTeaDecorate(noIceTeaDecorate);
    PackTeatDecorate packTeatDecorate = new PackTeatDecorate(sugarTeaDecorate);
    
    sugarTeaDecorate.describe();
    packTeatDecorate.describe();

输出结果:

珍珠奶茶    去冰  加糖  
珍珠奶茶    去冰  加糖  打包  

很明显,针对一种奶茶,可以包装很多种属性,相当于文前所说“动态的扩展一个对象的功能”。

相关文章

  • 装饰者(Decorator)模式

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

  • 装饰者模式和代理模式

    装饰者模式和代理模式 装饰者模式 名称:Decorator 分类:结构型模式 意图:动态的为目标对象增加功能,比继...

  • 设计模式之装饰器模式

    也称装饰者模式、装饰器模式、Wrapper、Decorator。 装饰模式是一种结构型设计模式,允许你通过将对象放...

  • Java23种设计模式之结构型模式「装饰器模式」

    装饰器模式 - Decorator Pattern 装饰器模式(Decorator Pattern)允许向一个现有...

  • 装饰者模式

    一、装饰者模式概述-Decorator 装饰者模式是动态地给一个对象添加一些额外的职责。想要扩展功能,装饰者模式提...

  • 【设计模式笔记】(十九)- 装饰者模式

    简述 装饰者模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),以透明动态...

  • 装饰器模式和代理模式的区别

    这两个设计模式看起来很像:对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一...

  • 装饰者模式(Decorator)

    定义动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现...

  • 装饰者模式(Decorator)

    统一接口 提供一个同一的接口同目标对象与装饰对象实现 目标对象 目标对象包装类 在调用目标对象业务方法前后,可以有...

  • Decorator(装饰者模式)

    原文 别名 包装器 目的 动态地向一个对象添加额外职责,装饰模式提供了相对子类更加灵活的添加功能方式。 解释 真实...

网友评论

      本文标题:装饰者(Decorator)模式

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