6.外观模式
今天不小心上班又迟到了,螃蟹还是觉得比较愧疚。虽然现在感觉又木有什么事了,公司的项目进展实在有些慢,有机会还是想去大公司学习学习。废话不多说了,昨天搞了三个设计模式,数据访问对象模式,装饰器模式和委托模式。这里回顾一下委托模式,螃蟹之前的比喻就是中介,就是原对象后期可能增加很多功能,这些功能基本相似,那就避免在原对象创建过多的重复性代码,把功能拿出来定义成类,再通过委托类动态实现功能的处理。螃蟹感觉是有些难理解,不过逻辑还是清楚了。现在学习的外观模式感觉也不是很好理解,还是用比喻来说明。如果你有一部iphone手机,螃蟹都还没有,你会觉得外观很好看,但是你知道手机里面的构造肯定是异常复杂,为了不直接让你看到复杂的电路结构,所以用了酷酷的外壳展示给用户。外观模式就是这样,就是为了隐藏业务逻辑的复杂性而提供看似简单的接口给其他模块,比如搜索模块,只需要调用搜索的接口即可,而搜索接口对于传入参数的处理,数据库的操作以及返回结果的格式封装都隐藏了,这样就使得复杂的业务简单化了,虽然是表面的。
参考项目模块:日志系统
为什么螃蟹要用日志系统来说明呢,其实也没什么原因,就是觉得这个比较好用来展示这个模式。日志系统需要记录用户的操作,有需要转换为指定格式保存,还需要指定格式查询或导出。
日志类:Logs.class.php
id = $logs['id']; $this->uid = $logs['uid']; $this->type = $logs['type']; $this->created = $logs['created']; }}?>
主要用来创建日志对象,接下来创建日志功能类,传统的开发螃蟹一般都是直接在日志对象里面解决,学了外观模式后有了更好的解决方案。日志获取用户类:LogsGetUser.class.php
'螃蟹',2=>'小螃蟹',3=>'大螃蟹'); $logs->username = $user_array[$logs->uid]; }}?>
日志获取日期类:LogsGetDate.class.php
created = date('Y-m-d',$logs->created); } public static function getTime(Logs $logs){ $logs->created = date('Y-m-d H:i:s',$logs->created); }}?>
日志获取类型类:LogsGetType.class.php
'登录日志',2=>'搜索日志'); $logs->type = $logs_type_array[$logs->type]; }}?>
最后创建作为外观接口的日志服务类:LogsService.class.php
这么多功能类为这一个类服务,够气派哦。最后编写的测试类就很简单了,因为复杂的东西已经有人默默处理好了:TestFacade.php
1,'uid'=>2,'type'=>1,'created'=>1407210307));$logs2 = new Logs(array('id'=>2,'uid'=>1,'type'=>2,'created'=>1407211107));$logs3 = new Logs(array('id'=>3,'uid'=>3,'type'=>1,'created'=>1407201907));//输出结果print_r(LogsService::deal($logs1));echo '';print_r(LogsService::deal($logs2,'time'));echo '';print_r(LogsService::deal($logs3));?>
测试结果:
Logs Object ( [id] => 1 [uid] => 2 [type] => 登录日志 [created] => 2014-08-05 [username] => 小螃蟹 ) Logs Object ( [id] => 2 [uid] => 1 [type] => 搜索日志 [created] => 2014-08-05 05:58:27 [username] => 螃蟹 ) Logs Object ( [id] => 3 [uid] => 3 [type] => 登录日志 [created] => 2014-08-05 [username] => 大螃蟹 )
外观模式就到这了,之前螃蟹学过的建造者模式和适配器模式和这个都比较像,不过还是不同的,螃蟹已经领悟了,貌似也快到吃午饭的时候了,今天吃什么呢?