常用设计模式总结—装饰模式
在平时的编程过程中,我们可能会经常遇到这样一种情况,代码的输出是将输入层层包装以后来得到的。就好比我们装修的时候砌墙一样,先是刮水泥、然后是涂腻子,最近刷油漆,经过以上的步骤,我们就能够得到一面干净的墙了。
在开发桌面应用程序的时候,会比较多的碰到这种情况,理论上你只需要一个展示区域,但是为了展示的好看,你可能需要给你的边框。为了功能的实用,你可能会加上滚动条。这些都可以用装饰模式来搞定。
装饰模式适用的场景:
1) 在不影响其它对像的情况下,动态、透明的给这个对象添加职责
2) 处理那些可以撤销的职责
优缺点
1) 比静态继承更加灵活,decorator提供了一种更加灵活的往对象添加职责的方式。
2) 避免在继承结构的上层定义太多的特征。Decrorator采用一种“即用即付”的方式添加职责,它并不采一种复杂的可定制的类中支持所有可预见的特征。相反,你可以定义一些简单的类,用这些简单的类“堆砌”成最终的功能。
3) Decorator最大的缺点就是声明对象的过程中会产生很多小的对象。
类图
来看源代码吧
1) VisualComponent.java
package zl.study.designpattern.decorator;
public interface VisualComponent {
public void draw();
}
2)TextView.java
package zl.study.designpattern.decorator;
public class TextView implements VisualComponent{
private String text;
public TextView(String text){
this.text = text;
}
@Override
public void draw() {
System.out.println(text);
}
}
3)Decorator.java
package zl.study.designpattern.decorator;
public class Decorator implements VisualComponent {
public Decorator(VisualComponent component ){
this.component= component;
}
@Override
public void draw() {
component.draw();
}
private VisualComponent component;
}
4) BorderDecorator.java
package zl.study.designpattern.decorator;
public class BorderDecorator extends Decorator{
private int width;
public BorderDecorator(VisualComponent component,int width) {
super(component);
this.width = width;
}
@Override
public void draw() {
super.draw();
drawBorder();
}
private void drawBorder(){
System.out.print("|"+ width);
}
}
5)ScrollDecorator.java
package zl.study.designpattern.decorator;
public class ScrollDecorator extends Decorator{
public ScrollDecorator(VisualComponent component) {
super(component);
}
@Override
public void draw() {
drawScroll();
super.draw();
}
private void drawScroll(){
System.out.println("scroll");
}
}
测试的程序
DecoratorTest.java
package zl.study.designpattern.decorator.test;
import zl.study.designpattern.decorator.BorderDecorator;
import zl.study.designpattern.decorator.ScrollDecorator;
import zl.study.designpattern.decorator.TextView;
import zl.study.designpattern.decorator.VisualComponent;
public class DecoratorTest {
public static void main(String args[]){
VisualComponent component = new ScrollDecorator(
new BorderDecorator(
new TextView("hello World!"),10
)
);
component.draw();
}
}