装饰模式(decorator pattern)是在不必改变原类文件和使用继承的情况下,就能动态地扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
【例10-17】
演示装饰模式。
下面通过一个示例演示如何利用装饰模式来扩展一个类的功能。
步骤1:在项目chapter10下新建一个cn.linaw.chapter10.demo04包,在包里新建一个NormalCar类,如图10-25所示。
图10-25 被装饰类NormalCar
步骤2:通过装饰模式对该NormalCar类的功能进行增强,使得NormalCar具备飞的新功能。在同一个包下新建一个装饰类FlyingCar,如图10-26所示。
图10-26 装饰类FlyingCar
步骤3:通过一个测试用例Decorator Pattern Test来测试NormalCar对象在装饰前后功能的区别,如图10-27所示。
(www.xing528.com)
图10-27 DecoratorPatternTest
根据排列组合的关系,当一个类中需要增加的功能越多的时候,就会增加许多子类,造成子类的迅速膨胀,此时就需要用到装饰模式,变继承关系为组合关系。
本例中,FlyingCar装饰类可以对传入的被装饰对象增加fly()功能。假如又定义一个SwimmingCar装饰类,它可以对传入的被装饰对象增加swim()功能。如果采用装饰模式,则我们可以灵活组合,动态扩展功能。比如想构造一个会跑又会飞的车:new FlyingCar(new NormalCar),想构造一个会跑又会游的车:new SwimmingCar(new NormalCar),还可以构造一个会跑、会飞还会游的车:new SwimmingCar(new FlyingCar(new NormalCar))。
项目总结
文件可以持久地保存内容,本项目详细介绍了File类的方法,并着重讲解了遍历目录和删除目录实现。输入输出流(I/O流)用于程序内存和外存的交互,Java IO流很多,本项目主要结合文件讲解。IO流分为字节流和字符流,字节流按照字节读写数据,其抽象类是InputStream和OutputStream,本项目详细介绍了它们的部分实现类FileInputStream、FileOutputStream,BufferedInputStream、Buffered OutputStream,ObjectInputStream、ObjectOutputStream;字符流按照字符读写数据,其抽象类是Reader和Writer,本项目详细介绍了它们的部分子类FileReader、FileWriter,Bufferd Reader、Buffered Writer,以及转换流InputStream Reader、OutputStreamWriter。值得注意的是,在JDK中提供的与文件操作相关的类都很基础,使用时不是很方便,可以使用Apache提供的commons-io工具包中的IOUtils和FileUtils,从而方便地对文件和IO流进行操作。
本项目最后讲解了装饰模式,装饰模式的核心是在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。装饰模式体现了面向对象设计原则中的合成/聚合复用原则,即尽量使用合成/聚合,尽量不要使用类继承。装饰类和被装饰类之间的关系就是Is-A、Has-A和Use-A。其中,Is-A代表继承,Has-A代表合成,Use-A代表依赖。
项目作业
1.简述字节流和字符流的关系。
2.编写一个程序,使用转换流拷贝一个文本文件,输入时指定字符编码GBK,输出时指定为UTF-8。文件路径要求使用相对路径。
3.上机实践书中出现的案例,可自由发挥修改。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。