大话设计模式
字体: 16 + -

第206章

大b:“在谈及软件中的结构,一般会用uml图表示。”

小a:“喔。”

大b:“uml和ant、junit等都是软件设计中基本的工具,会了没有啊!”

小a:“是吗?”

大b:“我和你具体说说。1、component就是装饰器模式中公共方法的类,在装饰器模式结构图的顶层。2、concreatecomponent是转换器模式中具体的被装饰的类,io包中的媒体流就是此种对象。3、decorator装饰器模式中的核心对象,所有具体装饰器对象的父类,完成装饰器的部份职能。刚才的例子中decorator类和这里的对应。该类可以只做一些简单的包裹被装饰的对象,也可以还包含对component中方法的实现……它有一个鲜明的特点:继承至component,同时包含一个component作为其成员变量。装饰器模式动机中的动态地增加功能是在这里实现的。4、concretedecoratora和concretedecoratorb是两个具体的装饰器对象,他们完成具体的装饰功能。装饰功能的实现是通过调用被装饰对象对应的方法,加上装饰对象自身的方法。这是装饰器模式动机中的添加额外功能的关键。你可能还会发现:concretedecoratora和concretedecoratorb的方法不一样,这就是一般设计模式中谈及装饰器模式的‘透明装饰器’和‘不透明装饰器’。‘透明装饰器’就是整个decorator的结构中所有的类都保持同样的‘接口’,这里是共同方法的意思,这是一种极其理想的状况,就像餐饮的例子一样。现实中绝大多数装饰器都是‘不透明装饰器’,它们的‘接口’在某些子类中得到增强,主要看这个类与顶层的抽象类或者接口是否有同样的公共方法。io中的bytearrayinputstream就比inputstrem抽象类多一些方法,因此io中的装饰器是一个‘不透明装饰器’。”

小a:“喔。”

大b:“从io中输入字节流部分的装饰器我们可以知道:1、inputstream是装饰器的顶层类,一个抽象类!包括一些共有的方法,如:1、读方法——read(3个);2、关闭流的方法——close;3、mark相关的方法——mark、reset和marksupport;4、跳跃方法——skip;5、查询是否还有元素方法——available。2、fileinputstream、pipedinputstream……五个紫色的,是具体的被装饰对象。从它们的‘接口’中可以看出它们一般都有额外的方法。3、filterinputstream是装饰器中的核心,decorator对象。4、datainputstream、bufferedinputstream……四个是具体的装饰器,它们保持了和inputstream同样的接口。5、objectinputstream是io字节输入流中特殊的装饰器,它不是filterinputstream的子类,不知道sun处于何种意图不作为fileterinputstream的子类,其中流中也有不少的例子。它和其他filterinputstream的子类功能相似都可以装饰其他对象。io包中不仅输入字节流是采用装饰器模式、输出字节流、输入字符流和输出字符流都是采用装饰器模式。”