今天介绍装饰模式
定义:在不改变原类文件和不使用继承的情况下,动态的拓展一个对象的功能。
下面我们看一下类图
下面我用java代码实现一下
public interface Component {
//待装饰的父类接口
void method();
}
public class ConcreteComponent implements Component {
//待装饰类
@Override
public void method() {
System.out.print("我是需要被装饰的方法");
}
}
public abstract class Decorator implements Component {
//抽象装饰器
private final Component component;
public Decorator(Component component) {
this.component=component;
}
@Override
public void method() {
component.method();
}
}
public class ConcreteDecoratorA extends Decorator {
//具体装饰器A
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void method() {
System.out.print("对方法进行一层A包装");
super.method();
System.out.print("A包装结束");
}
public void methodA(){
System.out.print("被装饰器A拓展的功能");
}
}
public class ConcreteDecoratorB extends Decorator {
//具体装饰器B
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void method() {
System.out.print("对方法进行一层B包装");
super.method();
System.out.print("B包装结束");
}
public void methodB(){
System.out.print("被装饰器B拓展的功能");
}
}
最后是测试类
public class Test {
public static void main(String[] args) {
ConcreteDecoratorA concreteDecoratorA=new ConcreteDecoratorA(new ConcreteComponent());
ConcreteDecoratorB concreteDecoratorB=new ConcreteDecoratorB(new ConcreteComponent());
concreteDecoratorA.method();
concreteDecoratorA.methodA();
concreteDecoratorB.method();
concreteDecoratorB.methodB();
}
}
结果:对方法进行一层A包装
我是需要被装饰的方法
A包装结束
被装饰器A拓展的功能
我是需要被装饰的方法
B包装结束
被装饰器B拓展的功能
可以看出,我们对需要装饰的类ConcreteComponent进行了装饰,拓展了其原有的功能。
java中,IO流大量使用了装饰模式