装饰器模式 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对于响应的类图可以看到
对于此图 inputstream 就是总接口而左边的三个类 byteArrayInputStream FileInputStream 和StringBufferInputStream为具体的实现操作。是可以获取到真正的IO对象的;对于FilterInputStream就是一个装饰器的主类,对于继承自FilterInputStream的类就都是装饰器类了。
对于常用操作就是
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file"));
而实现自己的inputstream 装饰器需要如同其他的装饰器一样继承FilterInputStream即可了。