前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复习:GoF的23种设计模式之Decorator模式(结构型)

复习:GoF的23种设计模式之Decorator模式(结构型)

作者头像
营琪
发布2019-12-30 17:58:07
3090
发布2019-12-30 17:58:07
举报
文章被收录于专栏:营琪的小记录营琪的小记录

Decorator模式(装饰、修饰)

定义:一种动态地往一个类中添加新地行为(功能)的设计模式。装饰模式相比生成子类更灵活,这样可以给某个对象而不是整个类添加一些功能。

Decorator模式和Composite模式很类似,都是实现容器与内容、装饰与被装饰的一致性,可以再次查看文章:复习:GoF的23种设计模式之Composite模式(结构型)。Decorator模式实现类继承再编译时增加行为。即:接口(API)是“透明的”,装饰物与被装饰物具有的方法都是相同的。Java IO流就是典型地装饰模式。

举一个例子:

就拿蛋糕的制作来说,蛋糕就是一层一层的,最核心的一层是软蛋糕,上面再附上一层奶油,再敷上水果,就大致完成一个水果蛋糕了,这个一层一层就是装饰物,装饰物并没有改变原有的蛋糕,但是又增加多种味道,装饰物(水果、奶油)与被装饰物(核心蛋糕)除了“一致性,并且也是“透明”的。

示例代码:

代码语言:javascript
复制
//链式调用  一致性到透明性
public class DecoratorTest {
    public static void main(String[] args) {
        CakeAbstractComponent coreCake = new CoreCakeConcreteComponent("名字:核心蛋糕1");
        coreCake.getUse();
        AbstractDecorator cream1 = new CreamConcreteDecorator(
                new CreamConcreteDecorator(
                        new CoreCakeConcreteComponent("名字:核心蛋糕2")));
        cream1.getUse();
    }
}

abstract class CakeAbstractComponent {   //蛋糕的接口
    public abstract void getUse();

    public abstract String getName();
}

class CoreCakeConcreteComponent extends CakeAbstractComponent {
    private String name;

    public CoreCakeConcreteComponent(String name) {
        this.name = name;
    }
    public void getUse() {
        System.out.println("只是未装饰的蛋糕");
    }

    public String getName() {
        return name;
    }
}
abstract class AbstractDecorator extends CakeAbstractComponent{//抽象的装饰物
    protected CakeAbstractComponent component;

    public AbstractDecorator(CakeAbstractComponent component) {
        this.component = component;
    }
}
class CreamConcreteDecorator extends AbstractDecorator{
    public CreamConcreteDecorator(CakeAbstractComponent component) {
        super(component);
    }
    public void getUse() {
        System.out.println("在上面增加奶油了");
        component.getUse();
        System.out.println("在下面增加奶油了");
    }
    public String getName() {
        return component.getName() + "奶油";
    }
}

UML类图

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Decorator模式(装饰、修饰)
    • 举一个例子:
    • 示例代码:
      • UML类图
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档