本文共 2838 字,大约阅读时间需要 9 分钟。
转载请注明出处:
前言
在上面的几篇文章中,着重介绍了java 中常见的 IO 相关知识,在学习的过程中,发现 IO 包中是用了大量的装饰器模式,为了彻底的学习 IO,今天就来揭开装饰器模式的面纱。
为了弄明白装饰器模式的本质,我查看了很多资料,发现有很多文章要么说的很苦涩,要么举的例子不恰当。
其实我们可以这样理解装饰器模式, 就拿自己举例子,你把自己裸体的样子,想象成被装饰的对象。你的鞋子,你的寸衣,你的外套,你的手表,你的帽子 等等,都是你的装饰物,你和这些装饰物,是装饰和被装饰的关系。
实例展示
好了,现在我们用代码的方法去理解这样概念。
首先,我们发现,不管是裸体的人,还是你的鞋子、帽子,都有展示的功能,我们称之为show 方法。
我们定义一个接口,它具有展示的功能,也就是show() ,
package com.user;/** * 定义接口 * @author T * */public interface AbstractPerson { //具有展示的功能 void show() ;}现在应该定义一个裸体的自己了,Me 类
package com.user;/** * 定义一个具体的人,就是被装饰者 * @author T * */public class Me implements AbstractPerson { @Override public void show() { System.out.println( "什么都没穿,我展示的是裸体"); }}下面该定义,鞋子,帽子,手表等 装饰物,等等先别急,我们应该先定义一个鞋子,帽子,手表的抽象父类 AbstractClothes 。
其实抽象的父类有一个构造函数,构造函数里面的参数是抽象的人类,这里的用法很巧妙,这也是能够实现装饰功能的一个必不可少的步骤。
package com.user;/** * 定义抽象装饰物 * @author T * */public abstract class AbstractClothes implements AbstractPerson { AbstractPerson abstractPerson ; public AbstractClothes( AbstractPerson abstractPerson ){ this.abstractPerson = abstractPerson ; } @Override public void show() { abstractPerson.show(); }}下面开始定义,帽子装饰物 Hat 类, 继承 AbstractClothes 类
package com.user;/** * 帽子装饰物 * @author T * */public class Hat extends AbstractClothes { public Hat(AbstractPerson abstractPerson) { super(abstractPerson); } @Override public void show() { super.show(); say(); } public void say(){ System.out.println( "我展示一个帽子"); }}定义鞋子装饰类 Shoes , 继承 AbstractClothes 类
package com.user;/** * 鞋子装饰物 * @author T * */public class Shoes extends AbstractClothes { public Shoes(AbstractPerson abstractPerson) { super(abstractPerson); } @Override public void show() { super.show(); say(); } public void say(){ System.out.println( "我展示一双鞋子"); }}
创建测试类 Test
package com.user;public class Test { public static void main(String[] args) { //创建被装饰者 Me me = new Me() ; //裸体的人被装饰了帽子 ,具有了展示帽子的能力 Hat hat = new Hat( me ) ; // 带了帽子的人被装饰了鞋子,具有了展示鞋子的本领 Shoes shoes = new Shoes( hat ) ; shoes.show(); }}运行结果:
什么都没穿,我展示的是裸体我展示一个帽子我展示一双鞋子
装饰器模式的类图
在学习完了一个小例子之后,我们试着总结出装饰器模式的类图。
装饰器模式类图:
IO流实现细节:
参考资料: