装饰模式:不修改代码,给对象扩展新的功能

还是以我曾做过的项目举例吧,曾经做过一套图书销售管理系统,里面涉及库存图书信息查询功能。在这个功能里,除了要查询作者、出版社、定价等所有图书都共有的信息外,根据图书种类的不同还需要查询一些额外的信息。例如教材要查询适用年级、科目等,地图册要查询比例尺、国家、省份等信息。最初的设计是每种图书都有一个Service类来查询基本信息和特性信息,后来发现查询基本信息的代码大量冗余,每当基本信息出现变动时,要修改的代码有十几处。于是对架构做了改进,引入了装饰模式,程序框架变成下面这样:


首先还是定义一个BookService的接口,其中有查询(query)等方法,BookServiceImplBookService的一个实现,其中的查询(query)方法实现了查询图书基本信息的功能。对于教材来说,除了查询基本信息外,还要查询教材相关的特性信息,因此定义了一个TextbookServiceImpl类,该类也是BookService的一个实现,其中还包含了一个BookServiceImpl成员,这样在query方法中就可以先调用BookServiceImplquery方法查询基本信息,再增加对特性信息查询的代码。MapbookServiceImpl类也是同理。

通过装饰模式的应用,完美的解决了对象的通用处理和个性化处理的统一和矛盾的问题,希望能给你的设计带来一些启发。


本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
接上文:《 架构设计:系统间通信(28)——Kafka及场景应用(中1) 》 4-3、复制功能 我们在上文中已经讨论了Kafka使用分区的概念存储消息,一个topic可以有多个分区它们分布在整个Kafka集群的多个Broker服务节点中,并且一条消息只会按照消息生产者的要求进入topic的某一个分区。那么问题来了:如果某个分区中的消息在被消费端Pull之前,承载该分区的Broker服务节点就因为各种异常原因崩溃了,那么在这个Broker重新启动前,消费者就无法收到消息了。 为了解决这个问题,Apache

NAT后的FTP Server如何配置 - 2016-05-07 14:05:38

    今天遇到一个问题:公司开发的系统,在客户机房上线后,因为FTP服务器不能直接挂接在外网上,必须通过在路由器上进行NAT映射方式。     假设我们的路由器外网IP为1.2.3.4,FTP的内网IP为192.168.1.100,FTP的端口号为10000。采用FileZilla Server作为FTP服务器。     此时,需要在路由器上开放10000端口,映射到FTP的IP和端口上。     FileZilla Server设置为PASV模式,端口设置为10000-10000,指定IP为1.2.3

Linux追求记(1) - 2016-05-07 14:05:38

Linux追求记(1) 对于linux的窈窕睿智早有耳闻,今日一睹芳容。 承载Linux高傲灵魂的躯体 计算机体系结构:运算器,控制器,存储器,输入设备,输出设备 运算器:计算机的大脑,负责逻辑运算 控制器:要让计算机有条不紊的运行,控制器的责无旁贷,负责控制指令的执行 存储器 : 数据传入运算器,运算器需要空出手来等待下一个赶来汇合的数据,这就需要借助存储器了,运算器也需要将成果存储,同样需要存储器。 输入设备,输出设备:要和计算机交流就得依靠输入,输出设备 运算器,控制器,存储器是计算机的核心,输入输
找出单链表中的倒数第k个元素 解题思路: 为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果。不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素。 如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素。设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到
       1. Servlet核心(I) 1.1. 请求方式 1.1.1. 请求方式的种类 请求数据包中的请求行的第一个参数就是请求方式,是客户端向Web服务器发送请求时的意向说明,以此告知服务器该如何处理及解析提交的这些数据,而客户端提交的数据也会因为采用的提交方式不同来处理。后续的一切解析都是基于请求方式的不同而不同。在RFC标准文档中有详细的规定来说明请求方式的种类及作用。 区分请求种类也会为浏览器采用不同的缓存方式处理后续请求提供一个依据,从而提升响应速度。所以对于编程人员来讲,使用正确的请求
Q:什么是Shell,什么是shell脚本? A:Shell是一种用C语言编写的程序,它是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。它是命令语言、命令解释程序及程序设计语言的统称。它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。 命令解释程序 :shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。它由输入
最近做springmvc+mybatis+maven项目集成的时候遇到一个问题,项目搭起来以后,http请求怎么都进不到controller中,耗费 了一天多时间弄这个问题,最后发现还是自己对spring的配置文件和各种注解不熟。其实这个问题就是由于注解没配好的缘故 首先,从配置文件讲起 web.xml !-- 加载Spring配置文件 --context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-
[1] Insert an installation media of SLES in CD/DVD drive and restart your computer. After follwoing screen is shown, Select "Installation" to proceed next. [2] Select your language and keyboard layouts. And also check a box "I Agree to the Lisence Terms"

BESAppServer中JavaDump分析 - 2016-05-07 04:05:47

  1.1. Java dump概述 JavaDump即Java虚拟机的运行时快照。制作和分析dump时,常常将当时Java虚拟机运行时的状态和信息保存到dump文件。 dump分类: 线程Dump,包含JVM进程中所有线程的运行状态。纯文本格式。 堆Dump,包含线程Dump以及所有堆对象的状态。二进制格式。   1.2. 制作和分析Dump 1.2.1. 常见Java虚拟机 不同Java虚拟机的Dump规范不完全相同。线程dunp为纯文本格式,各虚拟机略有不同。 Java虚拟机类型 说明 HotSpo

Windows 2008 R2_组策略 - 2016-05-07 04:05:39

目录 目录 组策略 组策略对象GPO 实验一组策略的计算机配置 实验二组策略的用户配置 实验三首选设置 实验四组策略更改计算机桌面 组策略 组策略分为 计算机配置 和 用户配置 两部分: 1. 计算机配置:当计算机开机时,系统会根据计算机配置的属性来设置计算机环境。例如:我们在Jmilk.com这个AD域内设置了计算机配置组策略,则此策略就会被应用到这个域内的所有计算机。 2. 用户配置:当用户登录时,系统会根据用户配置的属性来设置用户的工作环境。例如:我们对组织单位 teacher 配置了组策略,则组织