• 假定已经有三个类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. Mac上重置mysql 5.7密码

    Mac上重置mysql 5.7密码 >我的mac系统是osx 10.12 装完mysql5.7之前根本登录不上,网上说用DMG方式装完后,后弹出一个框,上面会有临时密码,但是我安装的时候却手一抖 ...

  2. 2018年最新JAVA面试题总结之JavaWeb(2)

    转自于:https://zhuanlan.zhihu.com/p/39522575 1.tomcat的优化方式?回答:Tomcat的优化我准备从三方面来说: 第一部分: 内存优化Tomcat的默认内存 ...

  3. Runtime个别API的使用

    Runtime 关于属性部分API的说明以及使用方法 使用Runtime机制需要引入头文件: #import <objc/runtime.h> 1:  Ivar *class_copyIv ...

  4. RabbitMQ通过Exchange.topic 对routingkey 进行正则表达式匹配

    消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...

  5. BZOJ2759 一个动态树好题 LCT

    题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...

  6. 常见的JDBC驱动程序名称和数据库URL

    RDBMS                                                                              JDBC驱动程序名称        ...

  7. nginx学习.第一部分

    1.nginx的版本发布历史 2015年支持thread pool提供stream四层反向代理支持reuseport特性,支持http v2协议.完全可以替代LVS 2016年支持动态模块 2.ngi ...

  8. centos7部署openstack-ocata

    1.前言 本文旨在记录本人的一个实验过程,因为其中有一些坑,方便以后回顾查询. 其中限于篇幅(大部分是配置部分)有些内容省略掉了,官网都有,各位如果是安装部署的话可以参考官网,不建议使用本文. 以下是 ...

  9. MachineLearningOnCoursera

    Week Six F Score \[\begin{aligned} P &= &\dfrac{2}{\dfrac{1}{P}+\dfrac{1}{R}}\\ &= & ...

  10. Java IO 整理

    1.Java IO中的操作类之间的继承关系 2.在java中使用File类表示文件本身,可以直接使用此类完成文件的各种操作,如创建.删除 3.RandomAccessFile类可以从指定位置开始读取数 ...