装饰模式定义
Attach additional responsibilities to an object dynamically keeping the same interface. Decorator provide a flexible alternative to subclassing for extending functionality (动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活)
装饰模式的通用类图
装饰模式通用代码展示与分析
抽象构件(被装饰的抽象类)
package decoratorpattern;
/**
* 被装饰的抽象类
* @author jeek
*
*/
public abstract class Component {
public abstract void operate();
}
具体构件(被装饰类)
package decoratorpattern;
public class ConcreateComponent extends Component {
@Override
public void operate() {
// TODO Auto-generated method stub
System.out.println("被装饰对象 do somethong!");
}
}
装饰者抽象类
package decoratorpattern;
public abstract class Decorator extends Component {
private Component component = null;
public Decorator(Component _component) {
this.component = _component;
}
@Override
public void operate() {
// TODO Auto-generated method stub
this.component.operate();
}
}
具体装饰者类1
package decoratorpattern;
public class ConcreateDecorator1 extends Decorator {
public ConcreateDecorator1(Component _component) {
super(_component);
}
//定义自己的修饰方法
private void method1() {
System.out.println("method1 修饰");
}
//重写父类的operate方法
public void operate() {
// TODO Auto-generated method stub
this.method1();
super.operate();
}
}
具体装饰者类2
package decoratorpattern;
public class ConcreateDecorator2 extends Decorator {
public ConcreateDecorator2(Component _component) {
super(_component);
}
//定义自己的修饰方法
private void method2() {
System.out.println("method2 修饰");
}
//重写父类的operate方法
public void operate() {
super.operate();
this.method2();
}
}
客户端场景类
package decoratorpattern;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Component component = null;
//被装饰对象
component = new ConcreateComponent();
//第一次装饰
component = new ConcreateDecorator1(component);
//第一次装饰
component = new ConcreateDecorator2(component);
//修饰后运行
component.operate();
}
}
输出结果为:
method1 修饰
被装饰对象 do somethong!
method2 修饰
抽象构件是一个接口或者是抽象类,就是定义我们最核心的对象即最原始对象。
具体构件是最核心最原始最基本的接口或抽象类的实现,也就是被装饰者。
装饰者抽象类(一般是抽象类不是接口)实现抽象构件(接口或抽象类)的方法,自由添加本类的自有方法,但是在它的属性里必须有一个私有变量指向被装饰者(一般通过构造函数传递被装饰者)
具体装饰者完成被装饰对象的动态功能添加
装饰模式优缺点场景分析
装饰模式又称装饰者模式,其实他是代理模式的一种特殊形式,从他们及其相似的通用类图就可看出来。
装饰类和被装饰类可以独立发展,不会耦合(易维护易扩展)。装饰模式是继承关系的一种替代,不管怎么装饰动态添加功能,返回的总是一个抽象组件指向的对象,总是一个is-a的关系。可以随时动态的扩展装饰者的功能。
装饰着最大的问题就是如果装饰层数过多,而最里层的装饰出现了问题,若要修改,想想看那将是一个很蛋疼的事
一般对一个对象或者类有功能的改装或加装的场景下首选装饰模式
java 的JRE里输入输出流包(即io包)就是典型的装饰着模式。