装饰模式是一种结构型设计模式。其使用一种对客户端透明的方式,来动态的扩展对象的功能。同时,它也是继承关系的一种替代方案之一。定义:动态地给一个对象添加一些额外的职责。就增加个来说,装饰模式比生成子类更为灵活。
所以,我们可以在需要透明而且动态地扩展类的功能时,所以装饰模式。
1 创建一个被装饰的原始对象,也可以是接口还在抽象类:
package decoratorpattern;
public abstract class Component {
public abstract void operate();
}
2 创建原始对象的具体实现类:
package decoratorpattern;
public class ConcretComponent extends Component{
@Override
public void operate() {
System.out.println("ConcretComponent------operate");
}
}
3 创建一个抽象装饰者:
package decoratorpattern;
public class Decorator extends Component{
private Component component;
public Decorator(Component component) {
super();
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}
4 创建装饰着的具体实现类,做具体的实现;
package decoratorpattern;
public class ConcretDecoratorA extends Decorator{
public ConcretDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
operateA();
}
public void operateA(){
System.out.println("ConcretDecoratorA--------operateA");
}
public void operateB(){
System.out.println("ConcretDecoratorA--------operateB");
}
}
以及
package decoratorpattern;
public class ConcretDecoratorB extends Decorator{
public ConcretDecoratorB(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
operateB();
}
public void operateA(){
System.out.println("ConcretDecoratorB--------operateA");
}
public void operateB(){
System.out.println("ConcretDecoratorB--------operateA");
}
}
5 测试运行的效果:
package decoratorpattern;
public class Client {
public static void main(String[] args) {
Component component = new ConcretComponent();
Decorator decoratorA = new ConcretDecoratorA(component);
decoratorA.operate();
Decorator decoratorB = new ConcretDecoratorB(component);
decoratorB.operate();
}
}