<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                外觀(Facade)模式:為多個復雜的子系統提供一個一致的接口,使這些子系統更加容易被訪問。 >[danger]將多個類對象統一到facade類的某個方法中輸出 外觀(Facade)模式是“迪米特法則”的典型應用, **主要優點。** 1. 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。 2. 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,并使得子系統使用起來更加容易。 3. 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。 **主要缺點。** 1. 不能很好地限制客戶使用子系統類。 2. 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。 **模式的結構** 外觀(Facade)模式包含以下主要角色。 1. 外觀(Facade)角色:為多個子系統對外提供一個共同的接口。 2. 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。 3. 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能。 ![](https://img.kancloud.cn/4d/35/4d35a07a7ca50fe0643a6e54e6019007_509x539.png) ``` //外觀角色 class Facade { private $obj1; private $obj2; private $obj3; public function __construct(){ $this->obj1=new SubSystem01(); $this->obj2=new SubSystem02(); $this->obj3=new SubSystem03(); } public function method() { $this->obj1->method1(); $this->obj2->method2(); $this->obj3->method3(); } } //子系統角色1 class SubSystem01 { public function method1() { echo "子系統01的method1()被調用!<br>"; } } //子系統角色2 class SubSystem02 { public function method2() { echo "子系統02的method2()被調用!<br>"; } } //子系統角色3 class SubSystem03 { public function method3() { echo "子系統03的method3()被調用!<br>"; } } class Client { public static function main() { $f=new Facade(); $f->method(); } } Client::main(); 結果: 子系統01的method1()被調用! 子系統02的method2()被調用! 子系統03的method3()被調用! ``` ## **外觀模式的應用場景** 通常在以下情況下可以考慮使用外觀模式。 1. 對分層結構系統構建時,使用外觀模式定義子系統中每層的入口點可以簡化子系統之間的依賴關系。 2. 當一個復雜系統的子系統很多時,外觀模式可以為系統設計一個簡單的接口供外界訪問。 3. 當客戶端與多個子系統之間存在很大的聯系時,引入外觀模式可將它們分離,從而提高子系統的獨立性和可移植性。 ## **外觀模式的擴展** 在外觀模式中,當增加或移除子系統時需要修改外觀類或客戶端的源代碼,這違背了“開閉原則”。如果引入抽象外觀類,則在一定程度上解決了該問題, 在引入抽象外觀類之后,客戶端可以針對抽象外觀類進行編程,對于新的業務需求,不需要修改原有外觀類,而對應增加一個新的具體外觀類,由新的具體外觀類來關聯新的子系統對象,同時通過修改配置文件來達到不修改任何源代碼并更換外觀類的目的。 其結構圖如圖所示。 ![](https://img.kancloud.cn/a8/58/a8581ae250de2bc82dddba75f3f30c5a_540x532.png) ``` //子系統角色1 class SubSystem01 { public function method1() { echo "子系統01的method1()被調用!<br>"; } } //子系統角色2 class SubSystem02 { public function method2() { echo "子系統02的method2()被調用!<br>"; } } //子系統角色3 class SubSystem03 { public function method3() { echo "子系統03的method3()被調用!<br>"; } } //子系統角色4 class SubSystem04 { public function method4() { echo "子系統04的method4()被調用!<br>"; } } abstract class AbstractFacade{ abstract public function method1(); abstract public function method2(); } //原外觀角色類 class Facade1 extends AbstractFacade { private $obj1; private $obj2; private $obj3; public function __construct(){ $this->obj1=new SubSystem01(); $this->obj2=new SubSystem02(); $this->obj3=new SubSystem03(); } public function method1() { $this->obj1->method1(); $this->obj2->method2(); $this->obj3->method3(); } public function method2(){} } //添加或者刪除子系統角色而新增加外觀角色類 class Facade2 extends AbstractFacade { private $obj2; private $obj3; private $obj4; public function __construct(){ $this->obj2=new SubSystem02(); $this->obj3=new SubSystem03(); $this->obj4=new SubSystem04(); } public function method1(){ $this->obj2->method2(); $this->obj3->method3(); $this->obj4->method4(); } public function method2(){} } class Client { public static function main() { $f=new Facade1(); $f->method1(); //當移除子系統角色1,添加子系統角色4時,我們只需要重新定義Facade2即可 $f=new Facade2(); $f->method1(); } } Client::main(); ``` 結果: ``` 子系統01的method1()被調用! 子系統02的method2()被調用! 子系統03的method3()被調用! 子系統02的method2()被調用! 子系統03的method3()被調用! 子系統04的method4()被調用! ``` **文件加密的門面模式例子** ``` //讀取并返回配置文件的內容 function config($param){ //這里就不讀取配置文件,簡單返回測試下 return "CipherMachine"; } //抽象門面類 abstract class AbstractEncryptFacade { abstract public function FileEncrypt(string $fileNameSrc, string $fileNameDes); } // 舊加密類 class CipherMachine{ public function Encrypt($plainText){ //省略加密規則 $encryptText="舊加密類加密后的字符串"; return $encryptText; } } // 原門面類 // 新的門面類 class EncryptFacade extends AbstractEncryptFacade { //文件源內容 private $plainStr; //加密對象 private $cipher; //文件加密后的內容 private $encryptStr; public function EncryptFacade() { $this->cipher = new CipherMachine(); //其他對象 //... ... } public function FileEncrypt(string $fileNameSrc, string $fileNameDes) { //讀取文件內容 $this->plainStr = file_get_contents($fileNameSrc); //返回加密后的文件內容 $this->encryptStr = $this->cipher->Encrypt($this->plainStr); //將加密文件內容寫入文件中 file_put_contents($fileNameDes,$this->encryptStr); } } // 新加密類 class NewCipherMachine{ public function Encrypt($plainText){ //省略加密規則 $encryptText="新加密類加密后的字符串"; return $encryptText; } } // 新的門面類 class NewEncryptFacade extends AbstractEncryptFacade { //文件源內容 private $plainStr; //加密對象 private $cipher; //文件加密后的內容 private $encryptStr; public function NewEncryptFacade() { $this->cipher = new NewCipherMachine(); } public function FileEncrypt(string $fileNameSrc, string $fileNameDes) { //讀取文件內容 $this->plainStr = file_get_contents($fileNameSrc); //返回加密后的文件內容 $this->encryptStr = $this->cipher->Encrypt($this->plainStr); //將加密文件內容寫入文件中 file_put_contents($fileNameDes,$this->encryptStr); } } class Client{ public static function main(){ //讀取配置文件 $conf=config("encrypt.type"); //根據配置文件的值加密文件 if ($conf=="CipherMachine") { (new EncryptFacade)->FileEncrypt("./test.txt","newtest.txt"); }else{ (new NewEncryptFacade)->FileEncrypt("./test.txt","newtest.txt"); } } } Client::main(); ``` **例子:tp的門面模式** ``` namespace app\admin; class Test { public function hello($name) { return '你好啊,' . $name; } } namespace think; /** * Facade管理類 */ class Facade { /** * 始終創建新的對象實例 * @var bool */ protected static $alwaysNewInstance; /** * 創建Facade實例 * @static * @access protected * @param string $class 類名或標識 * @param array $args 變量 * @param bool $newInstance 是否每次創建新的實例 * @return object */ protected static function createFacade(string $class = '', array $args = [], bool $newInstance = false) { $class = $class ?: static::class;//app\facade\Test $facadeClass = static::getFacadeClass();//app\facade\Test 即Test子類的getFacadeClass返回的結果 if ($facadeClass) { $class = $facadeClass; } if (static::$alwaysNewInstance) { $newInstance = true; } //Container::getInstance() 實例化Container類 make()方法則實例化傳入的類并將此類對象掛載到instance屬性上(注冊樹模式?) //返回 實例化成功的類對象這里是指app\facade\Test return Container::getInstance()->make($class, $args, $newInstance); } /** * 獲取當前Facade對應類名 * @access protected * @return string */ protected static function getFacadeClass() {} /** * 帶參數實例化當前Facade類 * @access public * @return object */ public static function instance(...$args) { if (__CLASS__ != static::class) { return self::createFacade('', $args); } } /** * 調用類的實例 * @access public * @param string $class 類名或者標識 * @param array|true $args 變量 * @param bool $newInstance 是否每次創建新的實例 * @return object */ public static function make(string $class, $args = [], $newInstance = false) { if (__CLASS__ != static::class) { return self::__callStatic('make', func_get_args()); } if (true === $args) { // 總是創建新的實例化對象 $newInstance = true; $args = []; } return self::createFacade($class, $args, $newInstance); } // 調用實際類的方法 調用一個不存在或者不能訪問的靜態方法時觸發此方法 public static function __callStatic(string $method, array $params) { //$method為調用的不存在的那個方法, $params則是不存在這個方法的參數 return call_user_func_array([static::createFacade(), $method], $params); } } namespace app\facade; use think\Facade; class Test extends Facade { protected static function getFacadeClass() { return 'app\admin\Test'; } } //通常 $test = new \app\admin\Test; echo $test->hello('thinkphp框架'); // 輸出 你好啊,thinkphp框架 // 使用facade就 無需進行實例化 直接以靜態方法方式調用hello方法 echo \app\facade\Test::hello('thinkphp框架'); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看