简化Facade门面模式总结与实现

原创2018-12-19 13:23:2393
摘要:container.php容器类源文件代码<?php  /**  * 发送验证短信  * 1.涉及到三个操作:数据库操作,手机号合法性验证,发送验证短信  * 2.分别对应涉及到三个类:Db类,Validate类,Send类,这几个类都是工具类  */ //数据库操作类 class Db {  

container.php容器类源文件代码

<?php 
/**
 * 发送验证短信
 * 1.涉及到三个操作:数据库操作,手机号合法性验证,发送验证短信
 * 2.分别对应涉及到三个类:Db类,Validate类,Send类,这几个类都是工具类
 */
//数据库操作类
class Db
{
 //数据库连接
 public function connect()
 {
  return '第1步——连接数据库:数据库连接成功!<br><br>';
 }
}
//手机号验证类
class Validate
{
 //手机号合法性验证
 public function checkMobile()
 {
  return '第2步——手机号验证:手机号验证成功!<br><br>';
 }
}
//发送短信类
class Send
{
 //发送验证短信
 public function sendSms()
 {
  return '第3步——发送验证短信:验证短信发送成功!';
 }
}
//以上三个类我们当作工具类来用
/******************************************************************************/
//一.创建容器类
class Container
{
 //创建属性,用空数组初始化,该属性用来保存类与类的实例化方法
 public $instance = [];
 //初始化实例数组,将需要实例化的类,与实例化的方法进行绑定
 public function bind($abstract, Closure $process)
 {
  //键名为类名,值为实例化的方法
  $this->instance[$abstract] = $process;
 }
 //创建类实例
 public function make($abstract, $params=[])
 {
  return call_user_func_array($this->instance[$abstract],[]);
 }
}
/******************************************************************************/
//二、服务绑定: 将类实例注册到容器中
$container = new Container();
//将Db类绑定到容器中
$container->bind('db', function(){
 return new Db();
});
//将Validate类实例绑定到容器中
$container->bind('validate', function(){
 return new Validate();
});
//将Send类实例绑定到容器中
$container->bind('send', function(){
 return new Send();
});

demo.php调用页面代码

<?php 
/**
 * facade:门面模式,也叫外观模式
 * 1.就是将一些操作进行封装,对外提供一个统一的接口
 * 2.因为操作可能分布在多个类中,而容器恰好可以将不同的类与实现封装起来
 * 3.所以外观模式与依赖容器是黄金搭档,经常会放在一起使用
 */
require 'container.php';
/*
 *创建Facade类,实现以下三个功能
 * 1.连接数据库
 * 2.手机号合法性验证
 * 3.发送验证短信
 * 对于调用者来说,他不需要事先知道这三个操作在哪个具体的类中,它只需要调用Facade就可以执行以上三个操作
 */
class Facade
{
 //创建成员属性保存容器对象
 protected static $container = null;
 //创建一个初始化方法为容器对象赋值,来简化客户端调用
 public static function initialize(Container $container)
 {
  static::$container = $container;
 }
 /**
  * 因为已经在初始化方法中将容器对象导入到了当前类中,
  * 并且保存到了类的静态属性中,为所有类成员所共享,
  * 所以以下方法可直接调用不用再容器注入
  * 注意:这里全部采用后期静态延迟绑定方法来访问当前容器对象
  * 这主要是为了方便用户在静态继承的上下文环境中进行调用
  */
 //连接数据库
 public static function connect()
 {
  return static::$container->make('db')->connect();
 }
 //手机号合法性验证
 public static function checkMobile()
 {
  return static::$container->make('validate')->checkMobile();
 }
 //发送验证短信
 public static function sendSms()
 {
  return static::$container->make('send')->sendSms();
 }
}
//客户端调用
//初始化类门面类中的容器对象
echo '<h1>简化后的facade调用</h1>';
echo '<h2><span style="color:red">发送验证短信</span></h2>';
Facade::initialize($container);
//静态统一调用内部的方法(无须重复注入依赖容器对象啦,实现了细节隐藏,通用性更强)
echo Facade::connect();  //数据库连接
echo Facade::checkMobile();  //手机号合法性验证
echo Facade::sendSms();  //发送验证短信
?>

运行截图:

未标题-3.jpg


批改老师:韦小宝批改时间:2018-12-19 13:26:33
老师总结:写的很不错!代码清晰!注释明确!课后记得多练习哦!继续加油吧!

发布手记

热门词条