java装饰者模式

装饰者模式(Decorator),又叫包装者模式(wapper)

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

因为参考网上说法都不太一样,故按照我理解的意思描述下装饰者模式,以希望给后来者一些稍微的指引:

通俗地说就是包装对象,在不影响其他对象的情况下,动态,透明地给单个对象添加一些功能

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,如图:

需要几个部件:

1接口,或者抽象类

2被装饰者实现该接口,或者继承该抽象类

3装饰者实现该接口,或者继承该抽象类,定义被装饰对象的实例,对该实例进行进行包装

以常见的io接口类来说

抽象类InputStream

public abstract class InputStream implements Closeable

 抽象类InputStream的子类FileInputStream,被装饰者

public  class FileInputStream extends InputStream

抽象类InputStream的子类FilterInputStream,装饰者

public  class FilterInputStream extends InputStream 
     protected volatile InputStream in;
    //定义抽象类InputStream的实例,下行的构造方法中把这个实例传过来
     protected FilterInputStream(InputStream in) {
        this.in = in;
    }

FilterInputStream的子类BufferedInputStream,继承了父类的装饰功能

public class BufferedInputStream extends FilterInputStream

所以会有这样的语句:BufferedInputStream对InputStream的实例进行包装

BufferedInputStream bis=new BufferedInputStream(new FileInputStream("G:\\x269all.rmvb"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("G:\\x256.rmvb"));

自定义包装类:

接口:

public interface DrinkDecorator {
	void add();
}

实现类,被包装者

public class Coffee implements DrinkDecorator {

	public void add() {
		System.out.println("add some coffee ");
		System.out.println("add some water");

	}

}

实现类,包装者:

public class SweetCoffee implements DrinkDecorator {
	Coffee coffee;

	public SweetCoffee(Coffee coffee) {

		this.coffee = coffee;
	}

	public void add() {

		coffee.add();
		System.out.println("add some sugar");
		System.out.println("this is a sweet coffee");
	}

}

测试类:

public class DecoratorTest {
	public static void main(String[] args) {
		SweetCoffee sc = new SweetCoffee(new Coffee());
		sc.add();
	}
}
out:
add some coffee 
add some water
add some sugar
this is a sweet coffee


 

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84349699
今日推荐