还是以我曾做过的项目举例吧,曾经做过一套图书销售管理系统,里面涉及库存图书信息查询功能。在这个功能里,除了要查询作者、出版社、定价等所有图书都共有的信息外,根据图书种类的不同还需要查询一些额外的信息。例如教材要查询适用年级、科目等,地图册要查询比例尺、国家、省份等信息。最初的设计是每种图书都有一个Service类来查询基本信息和特性信息,后来发现查询基本信息的代码大量冗余,每当基本信息出现变动时,要修改的代码有十几处。于是对架构做了改进,引入了装饰模式,程序框架变成下面这样:
首先还是定义一个BookService的接口,其中有查询(query)等方法,BookServiceImpl是BookService的一个实现,其中的查询(query)方法实现了查询图书基本信息的功能。对于教材来说,除了查询基本信息外,还要查询教材相关的特性信息,因此定义了一个TextbookServiceImpl类,该类也是BookService的一个实现,其中还包含了一个BookServiceImpl成员,这样在query方法中就可以先调用BookServiceImpl的query方法查询基本信息,再增加对特性信息查询的代码。MapbookServiceImpl类也是同理。
通过装饰模式的应用,完美的解决了对象的通用处理和个性化处理的统一和矛盾的问题,希望能给你的设计带来一些启发。