您好,登錄后才能下訂單哦!
描述:Facade模式要求一個子系統的外部與其內部的通信必須通過一個統一的Facade對象進行。Facade模式提供一個高層次的接口,使得子系統更易于使用。
意義:將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。
1.調用子系統的訪問門面,獲取相關服務;
2.門面從容器中獲取子系統的實例;
3.通過子系統的實例,調用其相關服務。
1.了解facade模式。
2.調用子系統門面中不可訪問的方法,會自動觸發__callstatic
如 \App\Facade\Redis::set(.....);
3.static 靜態延時綁定。參考:PHP后期靜態綁定
4.Closure 匿名函數的運用,只有調用$closure()才開始真正起作用。
5.容器的實現。
\client.php 業務調用客戶端:
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
*/
namespace App;
require_once './InitIoc.php';
require_once './Facade.php';
require_once './Facade/Redis.php';
use App\Facade\Redis;
Redis::set('a','b');
echo PHP_EOL;
\Facade.php 門面類
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
* Time: 上午11:04
*/
namespace App;
use App\Ioc;
class Facade
{
public static function getFacadeRoot()
{
$facadeAccessor = static::getFacadeAccessor();
$obj = Ioc::resolve($facadeAccessor);
return $obj();
}
/**
*
* @param string $name
* @param array $arguments
* @return mixed
*/
public static function __callStatic(string $name, array $arguments)
{
$instance = static::getFacadeRoot();
if (! $instance) {
throw new RuntimeException('A facade root has not been set.');
}
return $instance->$name(...$arguments);
}
}
\Facede\Redis.php 訪問子系統能力的門面
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
* Time: 上午11:07
*/
namespace App\Facade;
//require_once '../Facade.php';
use App\Facade;
class Redis extends Facade
{
public static function getFacadeAccessor():string
{
return 'redis';
}
}
\Ioc.php服務容器
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
* Time: 上午11:22
*/
namespace App;
class Ioc
{
public static $instance = [];
/**
* 注入容器
* @param string $name
* @param \Closure $closure
*/
public static function register(string $name,\Closure $reslove)
{
static::$instance[$name]=$reslove;
}
/**
* 返回實例
* @param string $name
* @return mixed
*/
public static function resolve(string $name){
if(static::$instance[$name] instanceof \Closure){
return static::$instance[$name];
}else{
new $name;
}
}
}
\Subsystem\Redis.php 子系統服務能力類
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
* Time: 下午12:07
*/
namespace App\Subsystem;
class Redis
{
public static function set(){
echo "Hello world";
}
}
\InitIoc.php 將子系統的實例注入到容器
<?php
/**
* Created by PhpStorm.
* User: zhangrenjie
* Date: 2019/1/12
* Time: 下午1:45
*/
namespace App;
require_once './Subsystem/Redis.php';
require_once './Ioc.php';
use App\Subsystem\Redis;
use App\Ioc;
//將Redis連接注入容器
Ioc::register('redis',function(){
return new Redis();
});
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。