我们需要两个类 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");
}
}