• 假定已经有三个类A,B和C他们的继承关系如下
                             ClassA
Class B extends A  Class C extends A 

    想进一步扩展类B和类C的功能,新增三个方法 method1()、 method2()、 method3()。

    要求 类B和类C 满足 可能新增一个方法,两个方法,或者三个方法

  • 用继承扩展(缺点很大)    

    解决办法,用继承关系 给B写7个子类(3个方法的排列组合 2的三次方-1) 给A也写三个子类。

    采用继承的方式扩展B类和C类的功能,会导致子类的数目急剧增加,而且存在重复代码。

  • 装饰者设计模式

    在这种设计模式中,把需要扩展的功能(method1()、method2()、method3())放在装饰类中,装饰器类继承A、因此拥有类A的接口。在装饰器中还包含了一个类A的实例

    因此:装饰器不仅拥有类A实例的功能并且还能扩展类A实例的功能

下面定义三个装饰器类 Decorator1 Decorator2 Decorator3,他们分别提供一种新增的功能分别是 method1()、method2()、method3()

public class Decorator1 extends A{
protected A a;
public Decorator1(A a){
this.a=a;
}
public void method1(){
System.out.println("我是方法1");
}
}
public class Decorator2  extends A{
protected A a;
public Decorator2(A a){
this.a=a;
}
public void method2(){
System.out.println("我是方法2");
}
}
public class Decorator3  extends A{
protected A a;
public Decorator3(A a){
this.a=a;
}
public void method3(){
System.out.println("我是方法3");
}
}

在下面程序中对类B类进行了装饰,使它们具有method1()和method2()的功能 这样可以很灵活的满足需求

public class Test {
public static void main(String[] args) {
A a = new B();
Decorator1 d1= new Decorator1(a);
d1.method1(); Decorator2 d2= new Decorator2(a);
d2.method2();
}
}

可以看到 装饰器设计模式简化了类的继承关系,并且提高代码的可重用性

JDK设计模式之——装饰者模式的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  3. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

  4. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  5. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  6. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  7. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  8. 实践GoF的23种设计模式:装饰者模式

    摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...

  9. 设计模式:装饰者模式介绍及代码示例 && JDK里关于装饰者模式的应用

    0.背景 来看一个项目需求:咖啡订购项目. 咖啡种类有很多:美式.摩卡.意大利浓咖啡: 咖啡加料:牛奶.豆浆.可可. 要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客 ...

随机推荐

  1. 论文阅读笔记五十五:DenseBox: Unifying Landmark Localization with End to End Object Detection(CVPR2015)

    论文原址:https://arxiv.org/abs/1509.04874 github:https://github.com/CaptainEven/DenseBox 摘要 本文先提出了一个问题:如 ...

  2. python 集合去重

    data = set() data.clear() data.add('qq1') data.add('qq2') data.add('qq3') data.add('qq4') data.add(' ...

  3. thinkphp查询某个字段为空的数据

    $where['name'] = ['exp', 'is null']; //为空的 $where['name'] = ['exp', 'is not null']; //不为空的

  4. JS 实现blob与base64互转

    /** * base64 to blob二进制 */ function dataURItoBlob(dataURI) { var mimeString = dataURI.split(',')[0]. ...

  5. DDD - 概述 - 模块 (二)

    首先,你必须知道以下DDD构建块: Entities - 实体 Value objects - 值对象 Aggregate roots - 聚合跟 Repositories - 仓储对象 Factor ...

  6. SpringBoot简单入门

    一.创建SpringBoot项目 1.创建maven项目,pom引入springboot父级启动器(starter)依赖: <?xml version="1.0" encod ...

  7. 回文数(vector的使用)

    问题描述一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数.比如 121,2332 都是回文数,134567 不是回文数. 任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加 ...

  8. Xcode 10.1 运行老版本工程遇到问题解决记录

    近来接手公司一个历史遗留项目进行修改.上线工作,想想我都近三年没敲过iOS代码了也是慌.. 项目大致情况: 18年年初应上线项目,各种情况下一直搁置,到18年底了要重启上线,原来开发人员离职了都,年底 ...

  9. vs2015配置OpenCV遇到的问题

    OpenCV的配置过程可以参考博文:https://www.cnblogs.com/linshuhe/p/5764394.html 简要记载配置过程: 1.官网下载OpenCV安装包,并解压到目录,例 ...

  10. Debug命令详解

    Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须的. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...