我的java设计模式 总结【5】装饰器 Decorator

装饰器模式 Decorator

特点

Decorator 设计模式不会改变原有的东西,只是增加新的外观或者功能,样式等,且随着时间的推移,可以不断的实施修饰操作。在面向对象的程序设计中,扩展系统的原有功能也可以采用继承、组合的方式。继承也不会改变原有类(父类),但是由于工程的复杂和很多不可预测的改变,比如不同业务的数据组合数量简直无法想想,难道我们要为每一种组合都定义一个子类吗?显然这是不现实的,即通过继承的方式来应对未来的功能和外观改变通常是吃力不讨好的事情。组合的方式也不可取,因为这要求不断的修改父类的结构,这样可维护性和可靠性就大大降低了。
Decorator 设计模式很好的诠释了设计中 开闭 这个原则。

举例

写了一个简单的实例样例类图
代码如下:

//一个总体接口
public interface StyleStr {
String showStyle();
}

//一个实现类
public class MyStr implements StyleStr {
	@Override
	public String showStyle() {
		return "kiss ";
	}
}

//装饰器主类
public class StrDecorator implements StyleStr{
	protected StyleStr styleStr;
	public StrDecorator(StyleStr styleStr) {
	 this.styleStr = styleStr;
	 }
	@Override
	public String showStyle() {
		return styleStr.showStyle();
	}
}
// 两个装饰器类
public class AfterStr extends StrDecorator {
	public AfterStr(StyleStr styleStr) {
		super(styleStr);
	}
	public String showStyle() {
		return "dog "+super.showStyle();
	}
}
public class BeforeStr extends StrDecorator {

	public BeforeStr(StyleStr styleStr) {
		super(styleStr);
	}

	public String showStyle() {
		return  super.showStyle()+" cat ...";
	}
}
//具体调用
	public static void main(String[] args) {	
		MyStr ms=new MyStr();		
		AfterStr as=new AfterStr(ms);
		BeforeStr bs=new BeforeStr(ms);				
		AfterStr abs=new AfterStr(bs);
		BeforeStr bas=new BeforeStr(as);		
		AfterStr aabs=new AfterStr(abs);				
		System.out.println(ms.showStyle());
		System.out.println(as.showStyle());
		System.out.println(bs.showStyle());
		System.out.println(abs.showStyle());
		System.out.println(bas.showStyle());
		System.out.println(aabs.showStyle());
	}

JDK中的 Decorator

再java源码中也可以看到关于Decorator模式的引用最常见的就是java io 操作 InputStream对于响应的类图可以看到
input

对于此图 inputstream 就是总接口而左边的三个类 byteArrayInputStream FileInputStream 和StringBufferInputStream为具体的实现操作。是可以获取到真正的IO对象的;对于FilterInputStream就是一个装饰器的主类,对于继承自FilterInputStream的类就都是装饰器类了。

对于常用操作就是

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file"));

而实现自己的inputstream 装饰器需要如同其他的装饰器一样继承FilterInputStream即可了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值