Java设计模式之装饰模式

1. 什么是装饰模式

     个人理解为:对具体的内容进行一层一层的包装起来。在基本的设计原则中,有一条重要的设计准则叫做合成/聚合复用原则。所以代码复用应该尽可能使用委托,因为委托是松散耦合,只要接口不变,委托类的改动并不会影响其上层对象。注意:装饰者模式可以有效分离性能组件和功能组件,从而提升模块的可维护性并增加模块的复用性。


2. 装饰者模式角色

角色作用
组件接口组件接口是装饰者和被装饰者的父类或者接口。它定义了被装饰者的核心功能和装饰者需要加强的功能点。
具体组件具体组件实现了组件接口的核心方法,完成某一个具体的业务逻辑。它也是被装饰的对象。
装饰者实现组件接口,并持有一个具体的被装饰者对象
具体装饰者具有实现装饰的业务逻辑,即实现了被分离的各个增强功能点。各个具体装饰者是可以相互叠加的,从而可以构成一个功能更强大的组件对象

装饰者和被装饰者拥有相同的接口。被装饰者通常是系统的核心组件,完成特定的功能目标。而装饰者则可以在背装饰者的方法前后,加上特定的前置处理和后置助理,增强被装饰者的功能。


3. 装饰者实例

对输出结果进行增强。比如,现在需要将某一结果通过HTML进行发布,那么首先就需要将内容转换为一个HTML文本。同时,由于内容需要在网络上通过HTTP传输,故,还需要为其增加HTTP头。装饰者模式实现实例如下:


组件接口

public interface IPacketCreator
{
	public String handleContent();    //用于内容处理
}

具体组件

public class PacketBodyCreator implements IPacketCreator
{
	@Override
	public String handleContent()
	{
		return "Content of Packet";   //构造核心数据,但不包括格式
	}
}

装饰者

public abstract class PacketDecorator implements IPacketCreator
{
	public IPacketCreator component = null;
	
	public PacketDecorator(IPacketCreator c)
	{
		this.component = c;
	}
	
	@Override
	public String handleContent()
	{
		// TODO Auto-generated method stub
		return null;
	}
}

具体装饰者

public class PacketHTMLHeaderCreator extends PacketDecorator
{
	public PacketHTMLHeaderCreator(IPacketCreator c)
	{
		super(c);
	}
	
	/**
	 * 注意,该类委托了具体组件comonent进行核心业务处理
	 */
	@Override
	public String handleContent()
	{
		StringBuffer sb = new StringBuffer();    //将给定数据封装成HTML
		sb.append("<html>");
		sb.append("<body>");
		sb.append(component.handleContent());
		sb.append("</body>");
		sb.append("</html>\n");
		
		return sb.toString();
	}
}

public class PacketHTTPHeaderCreator extends PacketDecorator
{
	public PacketHTTPHeaderCreator(IPacketCreator c)
	{
		super(c);
	}
	
	@Override
	public String handleContent()      //对给定数据加上HTTP头信息
	{
		StringBuffer sb = new StringBuffer();
		sb.append("Cache-Control:no-cache\n");
		sb.append("Date:Mon,31Dec201204:25:57GMT\n");
		sb.append(component.handleContent());
		
		return sb.toString();
	}
}

测试

public class Main
{
	public static void main(String[] args)
	{
		//装饰者的构造函数,将被装饰对象传入
		IPacketCreator pc = new PacketHTTPHeaderCreator(
				new PacketHTMLHeaderCreator(new PacketBodyCreator()));

		System.out.println(pc.handleContent());
	}
}

Java中使用到装饰者模式的有OutputStream和InputStream。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值