【原创】PHP 设计模式之门面模式

什么是门面模式

门面模式又称为外观模式,门面模式的作用是为多个子类提供一个统一的高级口,隐藏系统的复杂度,可以提高系统的灵活性和安全性,不会暴露系统的复杂性。
客户端进行访问的时候不需要在意子类的复杂度和实现过程,只需要访问系统提供的统一入口就可以实现依赖的子类的所有功能。

测试实例

TestOneController.php

<?php

namespace App\Http\Controllers\Facade;

use App\Http\Controllers\Controller;

class TestOneController extends Controller
{
    public function methodOne()
    {
        echo 'This is method one.';
    }
}

TestTwoController.php

<?php

namespace App\Http\Controllers\Facade;

use App\Http\Controllers\Controller;

class TestTwoController extends Controller
{
    public function methodTwo()
    {
        echo 'This is method two.';
    }
}

TestThreeController.php

<?php

namespace App\Http\Controllers\Facade;

use App\Http\Controllers\Controller;

class TestThreeController extends Controller
{
    public function methodThree()
    {
        echo 'This is method three.';
    }
}

TestFourController.php

<?php

namespace App\Http\Controllers\Facade;

use App\Http\Controllers\Controller;

class TestFourController extends Controller
{
    public function methodFour()
    {
        echo 'This is method four.';
    }
}

Facade.php

<?php

namespace App\Http\Controllers\Facade;

class Facade
{
    private TestOneController $testOne;
    private TestTwoController $testTwo;
    private TestThreeController $testThree;
    private TestFourController $testFour;

    public function __construct()
    {
        $this->testOne = new TestOneController();
        $this->testTwo = new TestTwoController();
        $this->testThree = new TestThreeController();
        $this->testFour = new TestFourController();
    }

    public function methodOne()
    {
        $this->testOne->methodOne();
        $this->testTwo->methodTwo();
    }

    public function methodTwo()
    {
        $this->testThree->methodThree();
        $this->testFour->methodFour();
    }
}

Client.php

<?php
namespace App\Http\Controllers\Facade;

use App\Http\Controllers\Controller;

class Client extends Controller
{
    public function run()
    {
        $facade = new Facade();
        $facade->methodOne();
        echo "<br/>";
        $facade->methodTwo();
    }
}

从代码上看,如果没有门面类,客户端只能直接与子系统进行交互,子系统如果变化,很可能将会影响到客户端的调用。而子系统在不断优化重构中,可能会产生更多更小的类。这对于客户端来说似乎要记住太多的接口。使用门面模式增加门面类后,减少了客户端与子系统之间的耦合,也提高了可维护性。

应用场景

首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观Facade;其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;另外在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

参考链接:https://www.yangpanyao.com/archives/250.html

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注