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