quailzhang的专栏

做人要厚道

decorator设计模式一个实例

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

阅读更多
个人分类: 软件工程
上一篇pet store宠物商店数据库设计
下一篇Mysql数据库备份策略
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭