`

常用设计模式----装饰者模式

 
阅读更多
package org.design.patterns;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

/**
 * 装饰者模式:
 * 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比  "继承" 更有弹性的替代方案。 
 *
 * 设计原则:
 * 类应该对扩展开放,对修改关闭。
 *
 *特点:
 *--装饰者和被装饰对象有相同的超类型(如下文中的InputStream);
 *--可以用一个或多个装饰者包装一个对象;
 *--装饰者可以在所委托被装饰者的行为前/后,加上自己的行为,已达到特定的目的;
 *
 *==========================================
 *Java I/O中的有装饰者模式的体现
 *FilterInputStream及FilterOutputStream实现了装饰器模式
 *例如: new LineNumberInputStream(new BufferedInputStream(new FileInputStream(new File(""))))
 *其中LineNumberInputStream(加上了计算行数的能力)和BufferedInputStream(加入缓冲器)
 *都为具体装饰者,都是FilterInputStream的子类。
 *
 *Java I/O引入装饰者模式有一个"缺点":利用装饰者模式,常常照成设计中有大量的小类,数量多了就容易造成
 *困扰,理解装饰者模式的原理,有助于辨别装饰者类的组织结构。
 *
 *当然亦可扩展FilterInputStream编写自己特定目的的装饰者类(重写其read方法)。
 */

//FilterInputStream所有"装饰者"的基类,下面是其实现
class FilterInputStream extends InputStream {
 protected volatile InputStream in;//"被装饰"的对象的基类型

 protected FilterInputStream(InputStream in) {
  this.in = in;
 }
 
 public int read() throws IOException {
  return in.read();
 }
 public int read(byte b[]) throws IOException {
  return read(b, 0, b.length);
 }
 public int read(byte b[], int off, int len) throws IOException {
  return in.read(b, off, len);
 }

 public long skip(long n) throws IOException {
  return in.skip(n);
 }
 public int available() throws IOException {
  return in.available();
 }
 public void close() throws IOException {
  in.close();
 }
 public synchronized void mark(int readlimit) {
  in.mark(readlimit);
 }
 public synchronized void reset() throws IOException {
  in.reset();
 }
 public boolean markSupported() {
  return in.markSupported();
 }
}


//==================================================
/*Java I/O中的适配器模式的体现
 *两个适配器类:InputStreamReader和OutputStreamWriter实现了字节流到字符流的转换
 *例如:new BufferedReader(new InputStreamReader(new FileInputStream(new File(""))));
 */
//InputStreamReader实现了接口的转换
class InputStreamReader extends Reader {
 private final StreamDecoder sd;

 public InputStreamReader(InputStream in) {
  super(in);
  try {
   sd = StreamDecoder.forInputStreamReader(in, this, (String) null);
  } catch (UnsupportedEncodingException e) {
   throw new Error(e);
  }
 }

 public InputStreamReader(InputStream in, String charsetName)
   throws UnsupportedEncodingException {
  super(in);
  if (charsetName == null)
   throw new NullPointerException("charsetName");
  sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
 }

 public InputStreamReader(InputStream in, Charset cs) {
  super(in);
  if (cs == null)
   throw new NullPointerException("charset");
  sd = StreamDecoder.forInputStreamReader(in, this, cs);
 }

 public InputStreamReader(InputStream in, CharsetDecoder dec) {
  super(in);
  if (dec == null)
   throw new NullPointerException("charset decoder");
  sd = StreamDecoder.forInputStreamReader(in, this, dec);
 }

 public String getEncoding() {
  return sd.getEncoding();
 }

 public int read() throws IOException {
  return sd.read();
 }
 public int read(char cbuf[], int offset, int length) throws IOException {
  return sd.read(cbuf, offset, length);
 }
 public boolean ready() throws IOException {
  return sd.ready();
 }

 public void close() throws IOException {
  sd.close();
 }
}
分享到:
评论

相关推荐

    java常用设计模式-装饰器模式

    Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    本书还附带了一些基础类库的介绍,例如列表(List)、迭代器(Iterator)、列表迭代器(ListIterator)、点(Point)、矩形(Rect)等,这些都是在实现设计模式时常用的数据结构。 #### 十一、参考文献与索引 **参考文献与...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    常用设计模式及Java程序 pdf

    ### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...

    23常用设计模式的UML

    这个压缩包文件"23常用设计模式的UML"提供了23个经典设计模式的统一建模语言(UML)表示,这对于理解和应用这些模式至关重要。 首先,我们要了解UML是一种标准化的图形表示法,用于系统分析、设计和建模。它通过...

    .NET 23种常用设计模式

    ### .NET 23种常用设计模式 #### 概述 设计模式是在软件工程领域内被广泛采用的一种软件设计思路,旨在解决特定类型的问题。在.NET框架中,这些设计模式同样适用并能帮助开发者构建更加灵活、可扩展及易于维护的...

    JAVA常用设计模式.ppt

    设计模式的应用不仅限于上述几种,还包括适配器模式、装饰器模式、观察者模式、责任链模式、命令模式、迭代器模式、访问者模式、模板方法模式等。它们都是软件设计的宝贵工具,帮助我们写出更优雅、可复用的代码。...

    java中常用设计模式总结心得

    以下是对Java中常用设计模式的详细解释: 1. **单例模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置管理、线程池或者数据库连接池等场景。实现方式有懒汉式(线程不安全)、...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。在Java编程中,设计模式的应用极大地提高了代码的可读性、可维护性和可复用性。《设计模式——Java语言中的应用》这本书深入探讨...

    JAVA23个常用设计模式(ppt下载)

    这23个常用的设计模式涵盖了创建型、结构型和行为型三大类别,是每一个Java开发者应当熟悉并掌握的基础知识。 1. **创建型设计模式**:主要包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例...

    android常用设计模式

    Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...

    9种常用设计模式收集

    这里提到的"9种常用设计模式收集"涵盖了Java Web开发和Android开发中的一些核心设计原则,通过深入理解并应用这些模式,开发者可以提高代码的可读性、可维护性和可扩展性。 1. **单例模式**:单例模式确保一个类...

    java常用技术整理-设计模式

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见问题而形成的一套成熟的解决方案。在Java中,设计模式的应用对于提高代码的可读性、可维护性和复用性至关重要。以下是对Java中一些重要设计模式的...

    几种常用的设计模式介绍总结

    单例模式是一种常用的创建型设计模式,它保证一个类仅有一个实例,并提供一个全局访问点。单例模式通常用于控制资源的共享访问,例如数据库连接池、日志管理器等。 #### 实现方式 - **构造函数私有化**:防止外部...

    九种常用设计模式的应用!

    这篇博客“九种常用设计模式的应用!”探讨了九种常见的设计模式,并结合实际开发场景阐述了它们的应用。以下是对这些设计模式的详细介绍: 1. **单例模式**(Singleton):保证一个类只有一个实例,并提供一个全局...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 ...

    java几种常用的设计模式源码和心得

    本资源包含了2016年6月20日关于Java常用设计模式的源码和作者的心得体会,这对于我们深入理解和应用这些模式具有很大的帮助。 首先,我们要了解设计模式的基本分类。设计模式分为三大类:创建型模式(Creational ...

    JAVA常用设计模式

    Java中的设计模式是一种在软件开发过程中,为了应对特定问题而形成的通用解决方案...以上是关于Java中常用设计模式的详细解释,它们在实际编程中扮演着至关重要的角色,帮助开发者编写出高效、可扩展、易于维护的代码。

Global site tag (gtag.js) - Google Analytics