常用设计模式总结--装饰模式

常用设计模式总结—装饰模式

在平时的编程过程中,我们可能会经常遇到这样一种情况,代码的输出是将输入层层包装以后来得到的。就好比我们装修的时候砌墙一样,先是刮水泥、然后是涂腻子,最近刷油漆,经过以上的步骤,我们就能够得到一面干净的墙了。

在开发桌面应用程序的时候,会比较多的碰到这种情况,理论上你只需要一个展示区域,但是为了展示的好看,你可能需要给你的边框。为了功能的实用,你可能会加上滚动条。这些都可以用装饰模式来搞定。

装饰模式适用的场景:

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();
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值