zoukankan      html  css  js  c++  java
  • 读书笔记_java设计模式深入研究 第十一章 装饰器模式 Decorator

    1,装饰器模式利用包含代替继承,动态的给一个对象添加一些额外的功能。如下图UML,右侧采用装饰模式后实现。



    2,装饰器角色描述:
         -1,抽象构建角色(Component):接口,封装了将要实现的方法,如ILogger。
        -2,具体构建角色(ConcreteComponent):多个类,实现了抽象构建接口。
        -3,装饰角色(Decorator):抽象类,该类实现Component接口,同时引用对应接口的实例。
        -4,具体装饰角色:对具体过程完成装饰。
    3,具体代码如下:
    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:日志接口
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:27:01 PM Jing Created.
    *
    */
    public interface ILogger {
    /**
    *
    * 方法说明:记录日志模式
    *
    * Author: Jing
    * Create Date: Jan 5, 2015 2:27:27 PM
    *
    * @param msg
    * @return void
    */
    void log(String msg);
    }
     
    package pattern.chp11.decorator.logger;
     
    import java.io.DataOutputStream;
    import java.io.FileOutputStream;
     
    /**
    * 类描述:文件LOG
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:28:40 PM Jing Created.
    *
    */
    public class FileLogger implements ILogger {
    public void log(String msg) {
    DataOutputStream dos = null;
    try {
    dos = new DataOutputStream(new FileOutputStream("c:/log.txt", true));
    dos.writeBytes(msg + " ");
    dos.flush();
    dos.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
     
    }
    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:Console日志
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:27:54 PM Jing Created.
    *
    */
    public class ConsoleLog implements ILogger {
     
    public void log(String msg) {
    System.out.println("Console Log!");
    }
     
    }
    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:装饰器
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:46:34 PM Jing Created.
    *
    */
    public abstract class Decorator implements ILogger {
    protected ILogger logger;
     
    public Decorator(ILogger logger) {
    this.logger = logger;
    }
    }



    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:信息大写日志
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:48:31 PM Jing Created.
    *
    */
    public class UpLogger extends Decorator {
     
    public UpLogger(ILogger logger) {
    super(logger);
    }
     
    public void log(String msg) {
     
    msg = msg.toUpperCase();
    logger.log(msg);
    }
     
    }
    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:XML格式化数据
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:49:36 PM Jing Created.
    *
    */
    public class XMLLogger extends Decorator {
     
    public XMLLogger(ILogger logger) {
    super(logger);
    }
     
    public void log(String msg) {
     
    String s = "<msg>" + msg + "</msg> ";
    logger.log(s);
    }
    }
     
    package pattern.chp11.decorator.logger;
     
    /**
    * 类描述:
    *
    * @author: Jing
    * @version $Id: Exp$
    *
    * History: Jan 5, 2015 2:51:22 PM Jing Created.
    *
    */
    public class MainTest {
     
    public static void main(String[] args) {
    ILogger fileLog = new FileLogger();//文件日志
    XMLLogger log = new XMLLogger(fileLog);
    log.log("asdasdsad");
    }
    }
    4,JDK中的装饰器。
            JDK中装饰器使用最广的是IO输入输出流部分。查看对应源码。
            -1,接口 java.lang.Readable
    public int read(java.nio.CharBuffer cb) throws IOException;    
    -2,类 java.io.Reader
    成员变量:protected Object lock 用来实现同步。初始化时,指向当前对象。
      protected Reader() {
        this.lock = this;
        }

    -3java.io.BufferedReader
    成员变量:private Reader in;含有一个对Reader类的引用。
      private char cb[]; 缓存区
    方法:read
    public int read() throws IOException {
    synchronized (lock) {
    ensureOpen();
    for (;;) {
    if (nextChar >= nChars) {
    fill();
    if (nextChar >= nChars)
    return -1;
    }
    if (skipLF) {
    skipLF = false;
    if (cb[nextChar] == ' ') {
    nextChar++;
    continue;
    }
    }
    return cb[nextChar++];
    }
    }
    }
    -4,java.io.LineNumberReader
        继承BufferedReader
    LineNumberReader extends BufferedReader

        按行读取对应文件信息。
    public int read() throws IOException {
    synchronized (lock) {
    int c = super.read();
    if (skipLF) {
    if (c == ' ')
    c = super.read();
    skipLF = false;
    }
    switch (c) {
    case ' ':
    skipLF = true;
    case ' ': /* Fall through */
    lineNumber++;
    return ' ';
    }
    return c;
    }
    }
    -5,FileReader:实现对文件的读取
    public class FileReader extends InputStreamReader
    /**
    * Creates a new <tt>FileReader</tt>, given the name of the file to read
    * from.
    *
    * @param fileName
    * the name of the file to read from
    * @exception FileNotFoundException
    * if the named file does not exist, is a directory rather
    * than a regular file, or for some other reason cannot be
    * opened for reading.
    */
    public FileReader(String fileName) throws FileNotFoundException {
    super(new FileInputStream(fileName));
    }
     
    /**
    * Creates a new <tt>FileReader</tt>, given the <tt>File</tt> to read
    * from.
    *
    * @param file
    * the <tt>File</tt> to read from
    * @exception FileNotFoundException
    * if the file does not exist, is a directory rather than a
    * regular file, or for some other reason cannot be opened
    * for reading.
    */
    public FileReader(File file) throws FileNotFoundException {
    super(new FileInputStream(file));
    }
     
    /**
    * Creates a new <tt>FileReader</tt>, given the <tt>FileDescriptor</tt>
    * to read from.
    *
    * @param fd
    * the FileDescriptor to read from
    */
    public FileReader(FileDescriptor fd) {
    super(new FileInputStream(fd));
    }
    可以看到IO流完全按照装饰模式来实现。



























    欢迎转载,但转载请注明原文链接[博客园: http://www.cnblogs.com/jingLongJun/]
    [CSDN博客:http://blog.csdn.net/mergades]。
    如相关博文涉及到版权问题,请联系本人。
  • 相关阅读:
    SharePoint提交前有效性验证
    showModalDialog/showModelessDialog弹出窗刷新例子
    在多选用户字段中查找是否存在某个用户(转自JianYi博客)
    SQL获得月第一天等
    SQL如何将Null不参与计算
    自定义Icon字段
    Backup Exec Remote Agent 在远程服务器上启动时挂起,一直显示Starting状态
    一个好用的日期控件My97DatePicker
    使用错误页统一处理错误(转)
    MS SQL游标的使用
  • 原文地址:https://www.cnblogs.com/jingLongJun/p/4491065.html
Copyright © 2011-2022 走看看