Decorate
动态的将需要的逻辑添加在对象的现有方法上,提供了比继承更有弹性的替代方案
目的
动态给一个对象添加逻辑(不使用继承)
实现方式
- 装饰者和被装饰者继承自同一个超类
- 装饰者作为一个abstract类,其他decorator继承他
- 在装饰者中调用被装饰者的方法,所以在构造装饰者的时候必须传入被装饰者
- 每一个decorator调用父类的方法,然后再完成自己的逻辑
- 使用的时候需要被装饰者作为参数传入装饰器decorator中
- 可以进行多层装饰
缺点
- 增加很多小类,造成理解起来困难,AfterDecorator,BeforeDecorator
- 装饰者可能存在很多个,在实例化的时候,不容易确定需要实例化哪些,Decorator decorator = new AfterDecorator(new BeforeDecorator(component));
实例
Java IO
Java SDK中的IO使用了装饰者模式
UML图
代码实现
package org.lep.test.decorator;
public interface Component {
public void sleep();
}
package org.lep.test.decorator;
/**
* 类ConcreateComponent的实现描述:TODO 类实现描述
*
* @author lack 2017/1/3 17:12
*/
public class ConcreateComponent implements Component {
@Override
public void sleep() {
System.out.println("I am sleeping");
}
}
package org.lep.test.decorator;
/**
* 类Decorator的实现描述:TODO 类实现描述
*
* @author lack 2017/1/3 17:14
*/
public abstract class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void sleep() {
component.sleep();
}
}
package org.lep.test.decorator;
/**
* 类ClothDecorator的实现描述:TODO 类实现描述
*
* @author lack 2017/1/3 17:17
*/
public class AfterDecorator extends Decorator {
public AfterDecorator(Component component){
super(component);
}
@Override
public void sleep(){
super.sleep();
System.out.println("睡觉后。。。");
}
}
package org.lep.test.decorator;
/**
* 类ClothDecorator的实现描述:TODO 类实现描述
*
* @author lack 2017/1/3 17:17
*/
public class BeforeDecorator extends Decorator {
public BeforeDecorator(Component component){
super(component);
}
@Override
public void sleep(){
System.out.println("睡觉前。。。");
super.sleep();
}
}
package org.lep.test.decorator;
/**
* 类Test的实现描述:TODO 类实现描述
*
* @author lack 2017/1/3 17:27
*/
public class Test {
public static void main(String[] args) {
Component component = new ConcreateComponent();
Decorator decorator = new AfterDecorator(new BeforeDecorator(component));
decorator.sleep();
}
}