1、目标
演示设计模式之装饰者模式。
2、装饰者角色
a、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
b、具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
c、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
d、具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。
3、测试代码
a、接口【充当抽象构件】
package com.wen.interface_;
/**
* Component【角色a】
*
* @author John_wen
* @since 2015-1-1
*/
public interface Component {
/**
* 接口规范方法
*/
public void doSomething();
}
b、【具体构件】
package com.wen.interface_impl;
import com.wen.interface_.Component;
/**
* ConcreteComponent【角色b】
*
* @author John_wen
* @since 2015-1-1
*/
public class ConcreteComponent implements Component {
@Override
public void doSomething() {
System.out.println("我是具体构件角色");
// TODO 相关业务代码
}
}
c、装饰基类
package com.wen.interface_impl;
import com.wen.interface_.Component;
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void doSomething() {
// 委托给构建
component.doSomething();
}
}
d、具体装饰类
package com.wen.test;
import com.wen.interface_.Component;
import com.wen.interface_impl.Decorator;
/**
* 装饰者A
*
* @author John_wen
* @since 2015-1-1
*/
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void doSomething() {
super.doSomething();
System.out.println("我是装饰者A");
}
}
package com.wen.test;
import com.wen.interface_.Component;
import com.wen.interface_impl.Decorator;
/**
* 装饰者B
*
* @author John_wen
* @since 2015-1-1
*/
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void doSomething() {
super.doSomething();
System.out.println("我是装饰者B");
}
}
e、测试类
package com.wen.test;
import org.junit.Test;
import com.wen.interface_.Component;
import com.wen.interface_impl.ConcreteComponent;
public class TestClass {
@Test
public void test1() {
// 1、具体构件类【没有使用装饰者】
Component concreteComponent = new ConcreteComponent();
concreteComponent.doSomething();
System.out.println("-----------------------");
concreteComponent = new ConcreteDecoratorA(concreteComponent);
concreteComponent.doSomething();
System.out.println("-----------------------");
concreteComponent = new ConcreteDecoratorB(concreteComponent);
concreteComponent.doSomething();
}
}
f、测试结果
我是具体构件角色
-----------------------
我是具体构件角色
我是装饰者A
-----------------------
我是具体构件角色
我是装饰者A
我是装饰者B
4、总结
今天学习了一下原始的文件上传;用到了装饰者模式;就顺便看了下装饰者模式;给我感觉的装饰者模式并没有起多大的作用;和java的多态很像;但是感觉又比多态强大灵活;优点:就是功能扩展了不用通过创建更多的子类;只需使用new一个装饰者即可;