专栏首页java工会java设计模式-装饰者模式

java设计模式-装饰者模式

模式定义

动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性。

设计原则

  1. 多用组合,少用继承
  2. 类应设计的对扩展开放,对修改关闭。

UML类图

装饰者模式实例

先写一个被装饰者食物的类

被装饰者-食物类

/**
 * 被装饰者-食物类
 */
public class Food {
    private String foodName;
    public Food() {
    }

    public Food(String foodName) {
        this.foodName = foodName;
    }

    public String make() {
        return foodName;
    }
}

再定义几个装饰者类

装饰者-面包类

/**
 * 装饰者-面包类
 */
public class Bread extends Food {
    private Food food;
    public Bread(Food food) {
        this.food = food;
    }

    public String make() {
        return food.make() + "+面包";
    }
}

装饰者-奶油类

/**
 * 装饰者-奶油类
 */
public class Cream extends Food {
    private Food food;
    public Cream(Food food) {
        this.food = food;
    }

    public String make() {
        return food.make() + "+奶油";
    }
}

装饰者-蔬菜类

/**
 * 装饰者-蔬菜类
 */
public class Vegetable extends Food {
    private Food food;
    public Vegetable(Food food) {
        this.food = food;
    }

    public String make() {
        return food.make() + "+蔬菜";
    }
}

测试装饰者模型

public class DecoratorDemo {
    public static void main(String[] args) {
        Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));
        System.out.println(food.make());
    }

}

运行结果

香肠+奶油+蔬菜+面包
Process finished with exit code 0

这就相当于生活当中制作三明治的过程,我们先加一根香肠,再香肠上抹上一层奶油,再加上几片蔬菜,最后拿面包夹上。

java.io中的装饰者模式

总结

装饰者模型就是动态地添加更多功能的一种方式,是一种组合和委托的思想,但是会导致设计中出现许多小类,如果过度使用,会让程序变得很复杂,难以看明白。

本文分享自微信公众号 - java工会(javagonghui),作者:java工会

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java设计模式-装饰者模式

    这就相当于生活当中制作三明治的过程,我们先加一根香肠,再香肠上抹上一层奶油,再加上几片蔬菜,最后拿面包夹上。

    三哥
  • Java 泛型详解

    三哥
  • 如何用JavaScript写一个区块链?

    自去年开始,伴随着比特币的火爆,区块链成为比“人工智能”、“共享”还要火的词汇。各大企业,诸如阿里、京东、腾讯、百度等纷纷入局。

    三哥
  • java设计模式-装饰者模式

    这就相当于生活当中制作三明治的过程,我们先加一根香肠,再香肠上抹上一层奶油,再加上几片蔬菜,最后拿面包夹上。

    三哥
  • 设计模式-装饰者模式

    模式定义 动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性。 设计原则 多用组合,少用继承 类应设计的对扩展开放,对修改关闭。 UML类图 ? ...

    武培轩
  • 谷歌又麻烦了,1500+ 员工罢工,抗议公司包庇安卓之父等

    BuzzFeed 在10月30日曾报道,四名知情人士透露,谷歌 200 多名工程师本周晚些时候将组织一场全公司范围的“女性游行”罢工,以抗议谷歌包庇公司前高管,...

    老九君
  • 分叉Fork【区块链生存训练】

    8月1日20:20,Bitcoin Cash(前身是Bitcoin ABC)要给比特币的区块链来个硬分叉,虽然支持它的矿工的算力并不大,但也会闹出个BCC新币来...

    申龙斌
  • 回应员工大规模罢工抗议,谷歌CEO发内部信解决公司性骚扰问题

    上周,谷歌因为高管性侵丑闻,导致上万员工罢工抗议,针对持续发酵蔓延的抗议运动,谷歌CEO Sundar Pichai坐不住了,就在最近,他向内部员工发送一份备忘...

    镁客网
  • Percona XtraDB Cluster 的一些使用限制(PXC 5.7)

    Percona XtraDB Cluster有众多的优秀特性,使得mysql集群得以轻松实现。但是不要忽略了它的一些限制。如果你无法接受,或者你的应用程序或数据...

    Leshami
  • 浅谈 python multiprocessing(多进程)下如何共享变量

    1、问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? from multiprocessing import Process, Mana...

    用户1177713

扫码关注云+社区

领取腾讯云代金券