zoukankan      html  css  js  c++  java
  • 设计模式之装饰模式

      装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。在Java IO流部分中,有不少带缓冲的IO流就采用了装饰模式。我们接下来看一个案例,主要是扩展IO流中的读写功能,实现对文件进行逐行读取,打印输出到控制台中时,让每行之间增加一行的间距。

      测试打印的文件为Dog.java:

    package decoratorModel;
    /**
     * 测试装饰模式用的文件
     */
    public class Dog implements Comparable<Dog>{
    	private String name;
    	private int age;
    	public Dog() {
    	}
    	public Dog(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "Dog [name=" + name + ", age=" + age + "]
    ";
    	}
    	@Override
    	public int compareTo(Dog o) {
    		if(age>o.age){
    			return 1;
    		}
    		if(age<o.age){
    			return -1;
    		}
    		return name.compareTo(o.getName());
    	}
    }
    

      编写代码如下:

    package 装饰模式;
    /**
     * 为Reader扩展逐行读取的功能
     */
    import java.io.IOException;
    import java.io.Reader;
    
    public class BufferedReaderSuper {
    	private Reader reader;
    	//装饰Reader
    	public BufferedReaderSuper(Reader reader) {
    		this.reader=reader;
    	}
    	
    	private StringBuffer sb=new StringBuffer();
    	
    	public String readLine(){
    		sb.setLength(0);
    		int ch=0;
    		try {
    			while((ch=reader.read())!=-1){
    				char c=(char)ch;
    				sb.append(c);
    				if(c=='
    '){
    					break;
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		if(sb.length()==0){
    			return null;
    		}		
    		return sb.toString();
    	}
    	
    	public void close() {
    		try {
    			reader.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}	
    }
    -------------------------------------------
    package 装饰模式;
    /**
     * 测试类
     */
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    public class Test {
    	public static void main(String[] args) {
    		try {
    			BufferedReaderSuper brs=new BufferedReaderSuper(new FileReader("Dog.java"));
    			String str=null;
    			while((str=brs.readLine())!=null){
    				System.out.println(str);
    			}
    			brs.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

      执行测试类后,会发现在控制台上打印输出的文件内容,每行之间比原先增加了一个空行。

  • 相关阅读:
    近来无聊 写了一个google音乐的下载器
    HTML编辑器 HtmlArea
    Html编辑器 TinyMCE
    IE浏览器自定义地址协议 通过B/S程序中打开C/S程序
    html 元素的 onpropertychange 事件
    asp.net 服务器控件防止重复提交表单
    用 BindingSource 绑定窗体中控件不失去焦点无法更新数据源的问题
    动态创建大量 html dom 元素时提升性能
    很黄的日期格式化。。。
    Asp.net 导出 .html,.txt 等格式的文件
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8729495.html
Copyright © 2011-2022 走看看