decorator设计模式一个实例
2005-05-25 02:37
429 查看
我们需要两个类 MemoryStream以及FileStream。他们都具有两个成员函数 PutInt 以及 PutString。用户调用这两个函数分别用来向MemoryStream或者FileStream中写入一个整数或者一个字符串。MemoryStream以及FileStream负责将写入的数据以字节流的方式存放在内存或者磁盘上。
应用户要求,我们需要在将这些字节流写入内存或者磁盘上之前,做以下可能的操作:(1)自己设计压缩算法,进行压缩处理;(2)将一个二进制字节用两个字符表示,这两个字符恰好是该字节的16进制字符。比如字节“/xAB”会被转化为字符“A”“B”; (3) 进行和(2)相反的过程:将两个16进制的字符转化为一个二进制字节;(4)将字节流中的“/x0d /x0a”(Windows环境下的换行符)转化为“/x0a”(Unix环境下的换行符);(5)将字节流中的“/x0a”转化为“/x0d /x0a”。
//author:张安春
import java.io.*;
abstract class Stream{
public abstract void putInt(int i);
public abstract void putString(String str);
}
class FileStream extends Stream{
public FileStream(){}
public void putInt(int i){
System.out.println("FileStream put "+ i);
}
public void putString(String str){
System.out.println("FileStream put " + str);
}
}
class MemoryStream extends Stream{
public MemoryStream(){}
public void putInt(int i){
System.out.println("MemoryStream put "+ i);
}
public void putString(String str){
System.out.println("MemoryStream put " + str);
}
}
abstract class Decorator extends Stream{
protected Stream pStream;
public Decorator(Stream pStream){
this.pStream = pStream;
}
public void putInt(int i){
pStream.putInt(i);
}
public void putString(String str){
pStream.putString(str);
}
}
class Compress extends Decorator{
public Compress(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("Compress " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("Compress " + str + " now");
super.putString(str);
}
}
class Byte2Hex extends Decorator{
public Byte2Hex(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("Byte2Hex " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("Byte2Hex " + str + " now");
super.putString(str);
}
}
class Hex2Byte extends Decorator{
public Hex2Byte(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("hex2Byte " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("hex2Byte " + str + " now");
super.putString(str);
}
}
class DA2A extends Decorator{
public DA2A(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("DA2A " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("DA2A " + str + " now");
super.putString(str);
}
}
class A2DA extends Decorator{
public A2DA(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("A2DA " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("A2DA " + str + " now");
super.putString(str);
}
}
public class TestDecorator{
public static void main(String args[]){
FileStream fs=new FileStream();
MemoryStream ms = new MemoryStream();
Compress compress = new Compress(new FileStream());
Byte2Hex b2h = new Byte2Hex(new MemoryStream());
Hex2Byte h2b = new Hex2Byte(
new DA2A(
new Compress(
new FileStream())));
A2DA a2da = new A2DA(
new Byte2Hex(
new MemoryStream()));
h2b.putInt(10);
h2b.putString("UML");
System.out.println();
a2da.putInt(10);
a2da.putString("OOP");
}
}
应用户要求,我们需要在将这些字节流写入内存或者磁盘上之前,做以下可能的操作:(1)自己设计压缩算法,进行压缩处理;(2)将一个二进制字节用两个字符表示,这两个字符恰好是该字节的16进制字符。比如字节“/xAB”会被转化为字符“A”“B”; (3) 进行和(2)相反的过程:将两个16进制的字符转化为一个二进制字节;(4)将字节流中的“/x0d /x0a”(Windows环境下的换行符)转化为“/x0a”(Unix环境下的换行符);(5)将字节流中的“/x0a”转化为“/x0d /x0a”。
//author:张安春
import java.io.*;
abstract class Stream{
public abstract void putInt(int i);
public abstract void putString(String str);
}
class FileStream extends Stream{
public FileStream(){}
public void putInt(int i){
System.out.println("FileStream put "+ i);
}
public void putString(String str){
System.out.println("FileStream put " + str);
}
}
class MemoryStream extends Stream{
public MemoryStream(){}
public void putInt(int i){
System.out.println("MemoryStream put "+ i);
}
public void putString(String str){
System.out.println("MemoryStream put " + str);
}
}
abstract class Decorator extends Stream{
protected Stream pStream;
public Decorator(Stream pStream){
this.pStream = pStream;
}
public void putInt(int i){
pStream.putInt(i);
}
public void putString(String str){
pStream.putString(str);
}
}
class Compress extends Decorator{
public Compress(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("Compress " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("Compress " + str + " now");
super.putString(str);
}
}
class Byte2Hex extends Decorator{
public Byte2Hex(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("Byte2Hex " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("Byte2Hex " + str + " now");
super.putString(str);
}
}
class Hex2Byte extends Decorator{
public Hex2Byte(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("hex2Byte " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("hex2Byte " + str + " now");
super.putString(str);
}
}
class DA2A extends Decorator{
public DA2A(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("DA2A " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("DA2A " + str + " now");
super.putString(str);
}
}
class A2DA extends Decorator{
public A2DA(Stream pStream){
super(pStream);
}
public void putInt(int i){
System.out.println("A2DA " + i + " now");
super.putInt(i);
}
public void putString(String str){
System.out.println("A2DA " + str + " now");
super.putString(str);
}
}
public class TestDecorator{
public static void main(String args[]){
FileStream fs=new FileStream();
MemoryStream ms = new MemoryStream();
Compress compress = new Compress(new FileStream());
Byte2Hex b2h = new Byte2Hex(new MemoryStream());
Hex2Byte h2b = new Hex2Byte(
new DA2A(
new Compress(
new FileStream())));
A2DA a2da = new A2DA(
new Byte2Hex(
new MemoryStream()));
h2b.putInt(10);
h2b.putString("UML");
System.out.println();
a2da.putInt(10);
a2da.putString("OOP");
}
}
相关文章推荐
- 设计模式-Singleton模式(只有一个实例)
- Java设计模式(5)Singleton模式 只有一个实例
- 黑马程序员:单态设计模式static(使类在内存只有一个实例对象)
- 单态设计模式--一个类只能创建一个实例(对象)
- Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)
- 设计模式与实例代码:Decorator模式
- 设计模式---单件(C++版) 一个简单实例(避免用户忘记delete单件实例)
- 第二章 实例研究:设计一个文档编辑器--《设计模式-可复用面向对象软件的基础》Erich Gamma
- 每天一个设计模式之Decorator模式解决类间组合爆炸问题
- 设计一个只能创建一个唯一实例的类——单例模式
- 一天一个设计模式之装饰模式(Decorator)
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
- 简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)
- 【U3D日记-2016年9月2日】设计模式解决工作问题的一个实例
- Net设计模式实例之装饰者模式(Decorator Pattern)
- C++设计模式5--单例模式Singleton--当前对象只有一个实例
- (转)也谈设计模式,实例票据打印 解析 Decorator
- 装饰者模式(Decorator Pattern)——给爱用继承的人一个全新的设计眼界
- Net设计模式实例之装饰者模式(Decorator Pattern)(1)
- 每天一个设计模式之Decorator