什么是外观模式
外观模式(有时候也称门面模式)是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。
角色分析:
门面(FacadeCompany)角色:此角色封装一个高层接口,将客户端的请求代理给适当的子系统对象,是门面模式的核心接口。
子系统(ICBC)角色:实现子系统的具体功能,处理FacadeCompany对象指派的任务。子系统没有FacadeCompany的任何信息,没有对FacadeCompany对象的引用。
应用场景
- 在设计初期阶段,有意识的将不同的两个层分离
- 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,给调用它们的用户带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖
- 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,但又包含新的需求开发必须依赖的重要功能,此时可以为新系统开发一个外观Facade类,来提供设计旧系统比较清晰的简单接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
PHP 代码实现
<?php
/**
* 子系统
* Class SubSystemOne
*/
class SubSystemOne
{
public function methodOne()
{
print "子系统方法1<br />";
}
}
/**
* 子系统2
* Class SubSystemTwo
*/
class SubSystemTwo
{
public function methodTwo()
{
print "子系统方法2<br />";
}
}
/**
* 子系统3
* Class SubSystemThree
*/
class SubSystemThree
{
public function methodThree()
{
print "子系统方法3<br />";
}
}
/**
* 外观模式核心角色,外界调用
* Class Facade
*/
class Facade
{
public $one;
public $two;
public $three;
function __construct()
{
$this->one = new SubSystemOne();
$this->two = new SubSystemTwo();
$this->three = new SubSystemThree();
}
function methodA()
{
print "<br /> 方法组A()-----<br />";
$this->one->methodOne();
$this->two->methodTwo();
}
function methodB()
{
print "<br />方法组B()----<br />";
$this->two->methodTwo();
$this->three->methodThree();
}
function methodN()
{
// 子系统方法的任意组合
}
}
//=======================外观模式测试===============================
$facade = new Facade();
$facade->methodA();
$facade->methodB();
//结果
//方法组A()-----
//子系统方法1
//子系统方法2
//
//方法组B()----
//子系统方法2
//子系统方法3
参考资料:
https://blog.youkuaiyun.com/buzhidao_321/article/details/78599992