Java设计模式之装饰模式原理与用法实例详解

本文实例讲述了Java设计模式之装饰模式原理与用法。分享给大家供大家参考,具体如下:

装饰模式能在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。JDK中IO的设计就用到了装饰模式,通过过滤流对节点流进行包装来实现功能的扩展。

装饰模式的角色的组成:

① 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加工功能的对象。(InputStream、OutputStream)
② 具体构件(Concrete Component)角色:定义一个将要接收附加功能的类。(节点流)
③ 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。(过滤流FilterInputStream、FilterOutputStream)
④ 具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的功能。(带具体附加功能的过滤流,BufferedInputStream,DataInputStream等)

以下给出一个装饰模式的简单的例子:

1. 抽象构件角色:定义一个接口Component

package com.tydic.decorator;
//抽象构件角色
public interface Component {
  public void doSomething();
}

2. 具体构建角色:需要实现抽象构件角色,可以给这个对象添加一些职责。

package com.tydic.decorator;
/**
 * 具体构建角色,实现抽象构建角色
 * @author Administrator
 *
 */
public class ConcreteComponent implements Component {
  @Override
  public void doSomething() {
    System.out.println("功能A");
  }
}

3. 装饰角色:持有一个对象构建角色的引用,并且实现抽象构件角色。实现抽象构件角色是因为要保证增加了功能过后,类型不能发生改变,就像FilterInputStream还是一个输入流,仍然带有输入流的特性。而持有一个对象构建角色的引用是因为要想增加功能,就必须持有要被附加功能的构件角色的引用。

package com.tydic.decorator;
/**
 * 装饰角色,持有一个构件角色的引用,并且实现构件角色
 * 要想增加功能过后还是这个类型的构件就必须实现构件角色,要想增加功能,就必须持有要被附加功能的构件角色的引用,这就是为什么必须持有一个构件角色的引用
 * @author Administrator
 *
 */
public class Decorator implements Component {
  private Component component;//这是要被附加功能的构件角色,可通过实例化的时候传进来
  public Decorator(Component component) {
    this.component = component;
  }
  @Override
  public void doSomething() {
    component.doSomething();
  }
}

4. 具体装饰角色:需要继承装饰角色,并且给出要附加的功能

package com.tydic.decorator;
/**
 * 具体装饰角色1,需要继承装饰角色,并且给出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator1 extends Decorator {
  public ConcreteDecorator1(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在传过来的具体构件角色原有功能的基础上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能B");
  }
}
package com.tydic.decorator;
/**
 * 具体装饰角色2,需要继承装饰角色,并且给出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator2 extends Decorator {
  public ConcreteDecorator2(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在传过来的具体构件角色原有功能的基础上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能c");
  }
}

5. 编写客户端代码

package com.tydic.decorator;
public class Client {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();//具体构建角色
    Component component2 = new ConcreteDecorator1(component);//对component这个构件进行装饰
    Component component3 = new ConcreteDecorator2(component2);//对component2这个构件进行装饰
    component3.doSomething();
  }
}

总结:

装饰模式能够利用组合的做法,再不用继承的情况下,在运行时动态的对对象进行扩展。这是继承所做不到的。继承是静态的,对类的扩展。

装饰模式的优缺点:

优点:1.扩展对象的功能,比继承更加灵活。2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:会使程序变的比较复杂。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

您可能感兴趣的文章:

  • java设计模式之装饰模式详细介绍
  • Java设计模式之装饰模式(Decorator模式)介绍
  • Java设计模式之代理模式与装饰模式实例详解
  • java设计模式学习之装饰模式
  • Java设计模式之策略模式原理与用法实例详解
  • Javasript设计模式之链式调用详解
  • Java设计模式之动态代理模式实例分析
  • Java设计模式之静态代理模式实例分析
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
  • Java设计模式之装饰者模式详解和代码实例
时间: 2018-04-26

Java设计模式之策略模式原理与用法实例详解

本文实例讲述了Java设计模式之策略模式原理与用法.分享给大家供大家参考,具体如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.其中JDK里面的TreeSet类和TreeMap类就用到了策略模式.这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的. 策略模式

java设计模式之装饰模式详细介绍

1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.    装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任.换言之客户端并不会觉的对象在装饰前和装饰后有什么区别. 3.    装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展. 4.    装饰模式与类继承的区别: 1)    装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成

Javasript设计模式之链式调用详解

本文实例为大家分享了js设计模式之链式调用的具体代码,供大家参考,具体内容如下 写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); element.removeClass('green'); element.show(); // 链式调用 $(ele) .addClass('red') .removeClass('green') .show(); 而jqu

Java设计模式之静态代理模式实例分析

本文实例讲述了Java设计模式之静态代理模式.分享给大家供大家参考,具体如下: 代理模式,可以通过代理可以在原来的基础上附加一些其他的操作.静态代理模式相对比较简单无需再程序运行时动态的进行代理. 静态代理模式的角色: ① 抽象角色:真实对象和代理对象的共同接口.其中声明真实对象和代理对象需要做的事. ② 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用. ③ 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. 下面提

Java设计模式之装饰者模式详解和代码实例

装饰者模式可以给已经存在的对象动态的添加能力.下面,我将会用一个简单的例子来演示一下如何在程序当中使用装饰者模式. 1.装饰者模式 让我们来假设一下,你正在寻找一个女朋友.有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差.因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也

Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

本文实例讲述了Java设计模式之工厂模式.分享给大家供大家参考,具体如下: 一. 简单工厂 先来思考一个问题.我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建一个B实例,然后调用B实例的方法.这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需要使用C类来代替B类时,程序就不得不修改A类代码,如果应用中有100个或者10000个类以硬编码方式耦合了B类,则需要修改100个.10000个地方

Java设计模式之代理模式与装饰模式实例详解

本文实例讲述了Java设计模式之代理模式与装饰模式.分享给大家供大家参考,具体如下: 之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样! 从网上也搜了一些资料,发现两者还是有一些区别的.我们在学习的同时也把这种困惑搞清楚. 定义: 代理模式,为其他对象提供一种代理以控制对这个对象的访问. 装饰模式,动态地给一个对象添加一些额外的职责. 代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了. 因为代理对象已经取代了被代理对象. 装饰模式,给一个对象增加功能,

Java设计模式之装饰模式(Decorator模式)介绍

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

java设计模式学习之装饰模式

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活. 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能. 缺点:多层装饰比较复杂. 实例:给一个人配置穿衣 1:代码结构图 2:创建一个person类(  ConcreteComponent) package DecoratorModel; /** * 2017-10-9 10:39:09 * 装饰器设计模式 * Person 类 Concre

Java设计模式之动态代理模式实例分析

本文实例讲述了Java设计模式之动态代理模式.分享给大家供大家参考,具体如下: 前面介绍了静态代理模式,动态代理比静态代理模式更加强大.它能在程序运行时动态的生成代理对象.所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface.当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作. 动态代理的角色和静态代理的角色一样: ① 抽象角色:

Java设计模式之动态代理

动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问. 我们首先来谈谈什么是代理模式.假设客户带着需求去找公司,显然不会直接和软件工程师谈,而是和商务谈,此时客户会认为商务就代表公司,客户是通过商务去访问软件工程师的.我们就可以认为商务(代理对象)代理了软件工程师(真实对象),因此,代理的作用就是,在真实对象访问之前或者之后加入对应的逻辑,或者根据其他规则控制是否使用真实对象. 商务和软件工程师是代理和被代理的关系,客户是通过商务去访问软件工程师的.此时客户就是

Java设计模式之工厂方法模式实例简析

本文实例讲述了Java设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式使用的频率非常高,在我们日常的开发中总能遇见到它的身影.其定义为:Define an interface for creating an object, but let subclass decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口

Java设计模式之抽象工厂模式实例详解

本文实例讲述了Java设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 具体工厂类:生产创建某一类具体产品对象. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 那么抽象工厂模式和工厂模式的不同之处呢? 其实最大的不同就在于,在产品类的结构更加复杂时,抽象工厂模式针对不同的产品族(就是一类产品对象)定义了不同的行为,也就是在父类或接口中,定义了不同的产生方法.不同的产品族调用各自的创建方法.同时不同的产品族横向比较,也有可归类的相同特征,这些特征

Java设计模式之享元模式实例详解

本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

JavaScript设计模式之代理模式实例分析

本文实例讲述了JavaScript设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式的定义,代理是一个对象(proxy)用它来控制目标对象的访问.为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它对目标对象不进行任何修改,它的目的在于延缓"复杂"对象的初始化时间.这样可以在用到这个目标对象的时候再初始化他(对于单例来讲更是重要). 代理模式有两种分类: (1)普通代理 (2)惰性代理 具体看下面的例子 第一,普通代理模式 步骤一,接口检验文件的引用 //定义一个静

Java代理模式实例分析

本文实例讲述了Java代理模式.分享给大家供大家参考,具体如下: 一 不用代理模式的酒商 1 代码 class RealSubject // 真实角色(红酒厂商) { public void sell() { System.out.println("我是红酒厂商,欢迎品尝购买"); } } public class NoProxytest { // 客户端 public static void main( String[] args ) { RealSubject sub = new

JavaScript设计模式之责任链模式实例分析

本文实例讲述了JavaScript设计模式之责任链模式.分享给大家供大家参考,具体如下: 介绍 责任链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者.提交请求的对象并不知道哪一个对象将会处理它--也就是该请求有一个隐式的接受者(implicit receiv

java设计模式笔记之代理模式

代理(Proxy)模式: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 核心作用: 通过代理,控制对对象的访问. 可以详细控制访问某个(某类)对象的方法,在调用这个方法之前做前置处理,在调用这个方法之后做后置处理.即AOP的微观实现. AOP(Aspect Oriented Programming面向切面编程)的核心实现机制. 生活中的场景: 所谓代理,就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用