装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责。就是增加功能,装饰模式相比生成子类更加灵活。
继承与装饰模式比较:继承是静态给类增加功能,而装饰者是动态给类增加功能。
优点:
a. 装饰类和被装饰类互不耦合。
b. 装饰模式是一种继承关系的替代,不管装饰多少层,最终返回的对象都是一个Component,实现的还是is-a的关系。
c. 装饰模式可以动态扩展一个实现类的功能。
缺点:
多层装饰比较复杂,减少装饰类的数量,降低系统复杂度。
使用场景:
a. 扩展一个类的功能,或者给一个类增加附加的功能。
b. 动态给一个对象增加功能,这些功能能够动态撤销。
c. 为一批兄弟类改装或者加装功能。
实现的核心:继承和聚集,即Decorator继承一个最基本,最核心,最原始的接口或者抽象类Component,同时在Decorator类中又包含一个私有的Component类。
package org.decorator;
public abstract class Component {
// 创建被装饰类
// 抽象的方法
public abstract void operate();
}
package org.decorator;
public class ConcreteComponent extends Component {
// 具体实现
@Override
public void operate() {
System.out.println("do Something");
}
}
package org.decorator;
public class Decorator extends Component {
private Component component = null;
// 通过构造参数传递被装饰者
public Decorator(Component _component) {
// TODO Auto-generated constructor stub
this.component = _component;
}
// 委托被装饰者执行行
@Override
public void operate() {
// TODO Auto-generated method stub
this.component.operate();
}
}
package org.decorator;
public class ConcreteDecorator1 extends Decorator {
// 定义被装饰者
public ConcreteDecorator1(Component _component) {
super(_component);
}
// 定义自己的修饰方法
public void method1(){
System.out.println("method1 修饰");
}
// 重写父类的operate方法
@Override
public void operate() {
// TODO Auto-generated method stub
this.method1();
super.operate();
}
}
package org.decorator;
public class ConcreteDecorator2 extends Decorator{
// 定义被装饰者
public ConcreteDecorator2(Component _component) {
super(_component);
}
// 定义自己的修饰方法
public void method2() {
System.out.println("method2 修饰");
}
// 重写父类的operate方法
@Override
public void operate() {
// TODO Auto-generated method stub
this.method2();
super.operate();
}
}
package org.decorator;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Component component = new ConcreteComponent();
component = new ConcreteDecorator1(component);
component = new ConcreteDecorator2(component);
component.operate();
}
}