装饰模式

装饰模式顾名思义,就是添加一些额外的功能(装饰)。装饰是为了更加美观、更具艺术性,而基本的的操作不应该在装饰类中完成。装饰模式使得我们可以动态地为对象增加一些功能,而无需事先在类中定义。

装饰模式结构图如下:



下面是摘自《设计模式》的一个例子,稍微做了修改:


先给出类图:


下面是代码:

/**
 * @author Brandon B. Lin
 *
 */
public abstract class VisualComponent {
	/* 绘制图形 */
    public abstract void draw();
    /* 调整大小 */
    public abstract void reSize();
    /* 最大化 */
    public abstract void min();
    /* 最小化 */
    public abstract void max();
}

/**
 * @author Brandon B. Lin
 *
 */
public class TextView extends VisualComponent {

	@Override
	public void draw() {
		out.println("Do draw!");
		
	}
	
	@Override
	public void reSize() {
		out.println("Do reSize!");

	}
	
	@Override
	public void min() {
		out.println("Do min!");

	}

	@Override
	public void max() {
		out.println("Do max!");

	}



}

/**
 * @author Brandon B. Lin
 *
 */
public class VisualDecorator extends VisualComponent {
	protected VisualComponent component;
	
	// cnstructor
	public VisualDecorator(VisualComponent visualComponent) {
		this.component = visualComponent;
		// do something else
	}
	
	
	@Override
	public void draw() {
		component.draw();

	}

	
	@Override
	public void reSize() {
		component.reSize();

	}

	
	@Override
	public void min() {
		component.min();

	}

	@Override
	public void max() {
		component.max();

	}

}

/**
 * @author Brandon B. Lin
 *
 */
public class ScrollDecorator extends VisualDecorator {

	/**
	 * @param visualComponent
	 */
	public ScrollDecorator(VisualComponent visualComponent) {
		super(visualComponent);
	}
	
	@Override
	public void draw() {
		component.draw();
		System.out.println("Add Scrollbar");
	}

}

/**
 * @author Brandon B. Lin
 *
 */
public class BorderDecorator extends VisualDecorator {

	/**
	 * @param visualComponent
	 */
	public BorderDecorator(VisualComponent visualComponent) {
		super(visualComponent);
	}
	
	@Override
	public void draw() {
		component.draw();
		System.out.println("Add Border!");
	}

}

/**
 * @author Brandon B. Lin
 *
 */
public class DecoratorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TextView().draw();
		out.println("-------------------------");
		// 創建一個帶滾動條的
		new ScrollDecorator(new TextView() ).draw();
		out.println("-------------------------");
		
		// 帶邊框
		new BorderDecorator(new TextView()).draw();
		out.println("-------------------------");
		
		//帶邊框又帶滾動條 第一種方式
		new BorderDecorator(new ScrollDecorator(new TextView())).draw();
		out.println("-------------------------");
		// 第二種方式
		new ScrollDecorator(new BorderDecorator(new TextView())).draw();
	}

}

在Java API中,装饰模式最典型的例子是IO操作中的流。基本的读入输出操作在InputStream、OutputStream中定义,FilterInputStream是一个装饰类,其子类添加了诸如缓冲、数据类型转换、压缩、加密等额外功能,因此可以动态配置一个流的特性。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值