设计模式—装饰模式
定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活
代码
定义抽象构件
1 2 3
| public abstract class Component { public abstract void operate(); }
|
定义具体构件
1 2 3 4 5 6
| public class ConcreteComponent extends Component { @Override public void operate() { System.out.println("concreteComponent do something"); } }
|
定义抽象装饰类
1 2 3 4 5 6 7 8 9 10 11 12
| public abstract class Decorator extends Component{ private Component component;
public Decorator(Component component) { this.component = component; }
@Override public void operate() { this.component.operate(); } }
|
具体装饰类1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Decorator1 extends Decorator {
public Decorator1(Component component) { super(component); }
private void doSomething(){ System.out.println("decorator1 do something"); }
@Override public void operate() { this.doSomething(); super.operate(); } }
|
具体装饰类2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Decorator2 extends Decorator { public Decorator2(Component component) { super(component); } private void doSomething(){ System.out.println("decorator2 do something"); }
@Override public void operate() { this.doSomething(); super.operate(); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class DecoratorTest {
@Test public void testDecorator(){ Component component = new ConcreteComponent(); component.operate(); System.out.println("-----"); component = new Decorator1(component); component.operate(); System.out.println("-----"); component = new Decorator2(component); component.operate(); }
}
|
从结果可以看出 最终在基础构件的operate方法执行之前执行了两个装饰方法
使用场景
- 需要扩展一个类的功能,或者给一个类增加附加功能
- 需要动态地给一个对象增加功能,这些功能可以再动态撤销
- 需要为一批兄弟类进行改装或加装功能