装饰者设计模式----IO流

Java装饰模式 
装饰模式:给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。

实例化 装饰者子类的时候,是调用构建者子类来实例化,不会调用装饰者类,装饰者类对客户端来说是透明的,只是对功能的扩张。

UML类图: 

装饰模式与类继承的区别
1: 装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。
2: 装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。
3: 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真是的对象。

组成部分: 
抽象构件:原始的功能接口-----相当于i/o流里面InputStream/OutputStream和Reader/Writer
具体构件:具体的原始功能类----实现接口的类---------------相当于i/o里面的FileOutputStream和FileInputStream。
装饰角色:持有具体构件类的对象,以便执行原有功能------接口的实现类,类里调用接口的对象 --------------相当于i/o里面的FilerOutputStream和FilterInputStream
具体装饰:具体扩展的功能在这里--------------------------------相当于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。


public interface IComponent {
	 void Operation();
}

public class Component implements IComponent{

	public void Operation()
    {
		System.out.println("Component Operation");
    }
}

public abstract class Decorator implements IComponent {

	protected IComponent realComponnet;

	public Decorator(IComponent component) {
		realComponnet = component;
	}

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		if (realComponnet != null) {
			realComponnet.Operation();
		}

	}

}

public class AuthDecorator extends Decorator {

	/**
	 * @param component
	 */
	public AuthDecorator(IComponent component) {
		super(component);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		System.out.println("Befor Operation Authorization");
		super.Operation();
		System.out.println("After Operation Authorization");
	}

}

public class LogDecorator extends Decorator {

	/**
	 * @param component
	 */
	public LogDecorator(IComponent component) {
		super(component);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		System.out.println("Operation Logging");
		super.Operation();
		System.out.println("Operation Log Finished");
	}

}

在java IO中

DataoutputStream out=new DataoutputStream(new FileoutputStream());

这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。

这里不会调用到装饰者类--FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张.

 

 

输出结果: 
晚上 
开车 

其实装饰者就是给对象穿马甲 多穿一层就多加一点功能


转载于:http://www.cnblogs.com/ChrisRIM/archive/2012/08/21/2648372.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值