装饰者模式:
基本类图:
装饰者模式就是对基础组件进行修饰,装饰者和被装饰者通过继承的方式拥有共同结构,同时被装饰者作为装饰者的一个属性。 这样就可以像代理模式一样,去达到增强component的一些功能。
装饰者模式也不一定要通过继承,同样可以通过接口实现来表达。
public abstract class Component {
public abstract void operate();
}
public class ConcreteComponent extends Component{
@Override
public void operate() {
System.out.println("do something");
}
}
public abstract class Decorator extends Component {
private Component component;
public Decorator(Component component){
this.component=component;
}
@Override
public void operate(){
this.component.operate();
}
}
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
private void method1(){
System.out.println("method1 修饰");
}
@Override
public void operate(){
this.method1();
super.operate();
}
}
装饰者模式的优点
- 装饰类和被装饰类可以独立发展,不会相互耦合,Component类无须知道Decorator类
- 装饰类是继承关系的一个替代方案
- 装饰类可以动态扩展一个实现类的功能。
装饰者和代理模式的异同
- 装饰者模式和代理模式的共同点是代理模式代理类包含一个要代理的对象,装饰者模式装饰器也包含一个要装饰的对象。装饰者模式采用继承模式,而代理模式是采用实现同一个接口。 装饰者和被装饰是is-a关系。
- 上面一条不一定正确的,代理模式和装饰模式非常像,如果装饰者模式也可以是接口实现的。
- 装饰者模式和代理模式的区别更在于: 代理模式把当前的行为委托给其他对象执行,代理类负责接口限定: 比如是否可以调用真实角色,是否对发送到真实角色的消息进行加工处理。典型代表是AOP
- 而装饰者是保证接口不变的情况下加强或减弱累得功能,它是对原始类功能进行修饰使其更丰富或者简单,不做准入条件的判断和准入参数的过滤,装饰者不关心是否可以执行类的功能。典型代表是java.io.*包中的各种输入流和输出流。