装饰模式又名包装(Wrapper)模式。装饰模式以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。
类图:
示例:
装饰模式使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展时完全透明的。
1、模式的结构:
2、java代码
Component类:
package decorator;
public interface Component {
public void sampleOperation();
}
public void sampleOperation();
}
ConcreteComponent类:
package decorator;
public class ConcreteComponent implements Component{
public ConcreteComponent(){
System.out.println("ConcreteComponent。。。。。。");
}
public void sampleOperation() {
System.out.println("ConcreteComponent operate。。。。。。");
}
}
public ConcreteComponent(){
System.out.println("ConcreteComponent。。。。。。");
}
public void sampleOperation() {
System.out.println("ConcreteComponent operate。。。。。。");
}
}
Decorator类:
package decorator.decorator;
import decorator.Component;
public class Decorator implements Component{
private Component component;
public Decorator(Component c){
super();
component = c;
}
public Decorator(){
System.out.println("Decorator。。。。。。");
}
public void sampleOperation() {
component.sampleOperation();
}
}
private Component component;
public Decorator(Component c){
super();
component = c;
}
public Decorator(){
System.out.println("Decorator。。。。。。");
}
public void sampleOperation() {
component.sampleOperation();
}
}
DecoratorComponent类:
package decorator.decorator;
import decorator.Component;
public class ConcreteDecorator1 extends Decorator {
public ConcreteDecorator1(){
System.out.println("ConcreteDecorator1。。。。。。");
}
public ConcreteDecorator1(Component c){
super(c);
}
public void sampleOperation() {
super.sampleOperation();
System.out.println("ConcreteDecorator1 operate。。。。。。");
}
}
public class ConcreteDecorator1 extends Decorator {
public ConcreteDecorator1(){
System.out.println("ConcreteDecorator1。。。。。。");
}
public ConcreteDecorator1(Component c){
super(c);
}
public void sampleOperation() {
super.sampleOperation();
System.out.println("ConcreteDecorator1 operate。。。。。。");
}
}
package decorator.decorator;
import decorator.Component;
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(){
System.out.println("ConcreteDecorator2。。。。。。");
}
public ConcreteDecorator2(Component c){
super(c);
}
public void sampleOperation() {
super.sampleOperation();
System.out.println("ConcreteDecorator2 operate。。。。。。");
}
}
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(){
System.out.println("ConcreteDecorator2。。。。。。");
}
public ConcreteDecorator2(Component c){
super(c);
}
public void sampleOperation() {
super.sampleOperation();
System.out.println("ConcreteDecorator2 operate。。。。。。");
}
}
Client类:
package decorator;
import decorator.decorator.ConcreteDecorator1;
import decorator.decorator.ConcreteDecorator2;
public class Client {
public static void main(String args[]){
Component a = new ConcreteComponent();
Component decorator1 = new ConcreteDecorator1(a);
Component decorator2 = new ConcreteDecorator2(decorator1);
decorator2.sampleOperation();
}
}
装饰模式应当在什么情况下使用: