设计模式之 装饰器模式

装饰器模式是为已有功能动态的添加更多功能的一种方式。
  • 优点: 有效的把类的核心职责和装饰功能区分开,职责更细化
  • UML

image.png

  • code public interface Apple { /** * 描述 */ void res(); } public class ConcreteApple implements Apple { @Override public void res() { System.out.println("普通的苹果"); } }
    • 装饰器基类 public abstract class Decorator implements Apple { protected Apple apple; public Decorator(Apple apple) { super(); this.apple = apple; } @Override public void res() { apple.res(); } } public class ConcreteDecoratorA extends Decorator{ public ConcreteDecoratorA(Apple apple) { super(apple); } public void resA(){ System.out.println("被装饰器A扩展的功能"); } @Override public void res(){ System.out.println("装饰器A=>装饰成红色的"); super.res(); System.out.println("装饰器A=>装饰结束"); } } public class ConcreteDecoratorB extends Decorator{ public ConcreteDecoratorB(Apple apple) { super(apple); } public void resB(){ System.out.println("被装饰器B扩展的功能"); } @Override public void res(){ System.out.println("装饰器B=>装饰成绿色的"); super.res(); System.out.println("装饰器B=>装饰结束"); } }
      • 测试 ** * @author tanoak@qq.com * @date 2018/7/26 14:08 * @Desc 装饰器模式 * 1,不改变原类文件。 * 2,不使用继承。 * 3,动态扩展。 */ public class Main { public static void main(String[] args) { Apple apple =new ConcreteApple(); System.out.println("-----------未装饰-------------------\n"); apple.res();//原来的方法 System.out.println("------------------------------------\n"); test2(apple) ; } private static void test2(Apple apple){ ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple); System.out.println("\n-----------装饰后-------------------\n"); decoratorB.res(); System.out.println("------------------------------"); } } 总结
        • 使用场景 当系统需要增加新功能时,向旧的类中添加新的代码,装饰原有类的核心职责或主要行为 eg: 在上述代码中 我想要对苹果的颜色进行包装,但是也会存在不进行包装的情况,核心逻辑是苹果,其次是对苹果进行装饰

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云时之间

数据结构(三):栈与队列

3.1❶若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答: ? (1) 如果进站的车厢序列为123,则可能...

37970
来自专栏冷冷

【微信开发】 使用单例设计模式 提供AccessToken 和Jsapi_ticket缓存支持

上一篇 是使用ecache 做的缓存, 有些简单的微信项目并不需要这么复杂,所以就想到单例设计模式  首先,我们先定义一个单例对象 import java.ut...

21870
来自专栏大数据学习笔记

Hadoop源码分析:HDFS读取文件

Hadoop源码分析:HDFS读取文件 上一篇博客http://blog.csdn.net/chengyuqiang/article/details/78636...

47260
来自专栏个人分享

Hive metastore整体代码分析及详解

  从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结。那么我们先打开metadata的目录,其目录...

68530
来自专栏禁心尽力

反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射

简单粗暴,直奔主题。 需求:通过自定义注解和反射技术,将Excel文件中的数据自动映射到pojo类中,最终返回一个List<pojo>集合?   今天我只是通...

52190
来自专栏算法修养

PAT 1017 Queueing at Bank (模拟)

1017. Queueing at Bank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B ...

31270
来自专栏个人分享

Hive metastore源码阅读(三)

  上次写了hive metastore的partition的生命周期,但是简略概括了下alter_partition的操作,这里补一下alter_partit...

29120
来自专栏ios 技术积累

编程中需要了解的数学知识

指数值相反的两个数,其中一个数是另一个数的相反数。定义是只有符号不同的两个数互为相反数。相反数的性质是他们的绝对值相同。 例如:-2与+2互为相反数。用字母表...

17920
来自专栏算法修养

PAT 甲级 1021 Deepest Root (并查集,树的遍历)

1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B ...

39170
来自专栏开发 & 算法杂谈

PAT Advanced 1005

Given a non-negative integer N, your task is to compute the sum of all the digi...

9120

扫码关注云+社区

领取腾讯云代金券