Java IO<4>Java io与装饰器模式

Java io与装饰器模式

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

● Component抽象构件
Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。
注意在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component抽象构件。
● ConcreteComponent 具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
● Decorator装饰角色
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法,在它的属性里必然有一个private变量指向Component抽象构件
● 具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西。

装饰器举例

public interface Component {
    void method();  
}

public class ConcreteComponent implements Component{
    public void method() {
        System.out.println("原来的方法");
    }
}

public abstract class Decorator implements Component{
    protected Component component;
    public Decorator(Component component) {
        super();
        this.component = component;
    }
    public void method() {
        component.method();
    }    
}


public class ConcreteDecoratorA extends Decorator{

    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    
    public void methodA(){
        System.out.println("被装饰器A扩展的功能");
    }

    public void method(){
        System.out.println("针对该方法加一层A包装");
        super.method();
        System.out.println("A包装结束");
    }
}

以BufferedReader为例,里面也包含一个Reader对象,BufferedReader对Reader进行了装饰

Java io中的装饰器模式

根据上图可以看出:

●抽象构件(Component)角色:由OutputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。

●具体构件(ConcreteComponent)角色:由ByteArrayOutputStream、FileOutputStream、ObjectOutputStream、PipedOutputStream等类扮演。它们实现了抽象构件角色所规定的接口。

●抽象装饰(Decorator)角色:由FilterOutputStream扮演。它实现了OutputStream所规定的接口。

●具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是BufferedOutputStream、DataOutputStream等类扮演。

OutputStream源码:

//OutputStream
package java.io;
public abstract class OutputStream implements Closeable, Flushable {
    public abstract void write(int b) throws IOException;
    public void write(byte b[]) throws IOException {}
    public void write(byte b[], int off, int len) throws IOException {}
    public void flush() throws IOException { }
    public void close() throws IOException { }
}

具体的装饰器FilterOutputStream:作为装饰模式的抽象装饰角色FilterOutputStream类的源代码。

package java.io;
 
public class FilterOutputStream extends OutputStream {
	protected OutputStream out;
 
	public FilterOutputStream(OutputStream out) {
		this.out = out;
	}
 
	public void write(int b) throws IOException {
		out.write(b);
	}
 
	public void write(byte b[]) throws IOException {
		write(b, 0, b.length);
	}
 
	public void write(byte b[], int off, int len) throws IOException {
		if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
			throw new IndexOutOfBoundsException();
 
		for (int i = 0; i < len; i++) {
			write(b[off + i]);
		}
	}
 
	public void flush() throws IOException {
		out.flush();
	}
 
	@SuppressWarnings("try")
	public void close() throws IOException {
		try (OutputStream ostream = out) {
			flush();
		}
	}
}

具体的装饰角色BufferedOutputStream:

package java.io;
public class BufferedOutputStream extends FilterOutputStream {
	protected byte buf[];
	protected int count;
	public BufferedOutputStream(OutputStream out) {}
	public BufferedOutputStream(OutputStream out, int size) {}
	private void flushBuffer() throws IOException {}
	public synchronized void write(int b) throws IOException {}
	public synchronized void write(byte b[], int off, int len) throws IOException {}
	public synchronized void flush() throws IOException {}
}

●抽象构件(Component)角色:由Writer扮演。这是一个抽象类,为各种子类型提供统一的接口。

●具体构件(ConcreteComponent)角色:由BufferedWriter、CharArrayWriter、FilterWriter、OutputStreamWriter、PipedWriter、PrintWriter、StringWriter扮演。它们实现了抽象构件角色所规定的接口。

●抽象装饰(Decorator)角色:由OutputStreamWriter扮演。它实现了Writer所规定的接口。

●具体装饰(ConcreteDecorator)角色:由FileWriter扮演。

posted @ 2022-04-02 17:19  aixueforever  阅读(116)  评论(0编辑  收藏  举报