螃蟹学PHP设计模式之外观模式

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] => 大螃蟹 )

外观模式就到这了,之前螃蟹学过的建造者模式和适配器模式和这个都比较像,不过还是不同的,螃蟹已经领悟了,貌似也快到吃午饭的时候了,今天吃什么呢?

转载于:https://my.oschina.net/caroltc/blog/298081

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值