话说小白渐渐熟悉了公司的工作,慢慢地得心应手起来.
最近这段时间,公司发出去的客户端经常崩溃,但是客户常常描述不清楚崩溃的现象,造成分析困难.为了解决这个问题,项目经理决定加入日志功能,在崩溃后可以让客户提交日志文件以帮助分析.
这个功能的改造又交到了小白手上.要改造的类是一个相对固定的类,归属于公司的核心类库里面,很多项目都会用到.里面有三个重要方法 request1(),request2(),request3()都要加入日志.
小白很快就把代码写好了:
LogRecorder是一个记录日志的工具类.
小白拿着代码去给经理看,经理摇了摇头:"这个不行,没有可扩展性".
经理说,这个包是很多项目都有引用到的,但每个项目对日志处理的要求很可能不一样,不能一概而论.具体执行的动作要由具体项目来定义.
那该怎么做呢?如何在一个类内部执行由外部定义的方法呢?小白陷入了沉思...
突然他灵机一闪,想到了按钮监听的方法.当按钮按下时执行一个方法,但这个方法却是由外部定义的.那我能不能模仿这种方式呢?
说干就干.小白很快又写出了新的方法.他首先定义了
,然后在类中加入了如下代码:
这样,通过外部自定义的onRequestListener对象,就可以在类内部执行特定的方法了.
小白拿着修改后的结果去找经理,经理这次相当满意.
然后他又提了一个问题:假如我需要让可以执行的方法自由组合呢?比如,一个onRequestListener对象是写本地文件,另一个onRequestListener对象是写数据库.然后我希望同时既写本地文件又写数据库呢?或者,我在程序运行到某个时刻的时候,要动态地添加或者删除一个动作呢?
重新组合一个类?小白很快就否定了这种方案.两个可以组合,但如果有三个,四个,二十个呢?那有多少种组合方式,要新增多少类?
很快,他又想出了办法.我不保存单一的onRequestListener对象,而是保存一个对象集合,那不就好了?
新的代码很快就敲出来了:
这回,经理完全满意了.
这就是监听者模式.经理说.
通过这种模式,可以为类附加上多个监听对象.当被监听对象的状态变化或者执行某个动作时(request1()),被监听对象通知监听者们(notifyOnRequest1()),以执行它们各自相应的动作.在相对封闭或固定的类内部,需要监控它的状态或者让它额外执行某些动作时,常常可以使用这种模式.