《设计模式 - 外观模式》
《陈乐一 青鸟》 继续~
小李一直在一个三线小城市从事软件开发,于是有一天,他觉得应该去大城市打拼了......
在经过了面试之后,被一家X城XX公司录取了,并要求在XX日带齐资料入职......
于是, 小李就开始准备自己的资料(服务端) 给 公司提供了(客户端)~
一:准备资料
1:首先定义一个准备资料的通用接口:
// 通用接口 interface Entry { public function exec(); }
2:接着复印身份证/学历等等......
class IdCard implements Entry { public function exec() { echo '复印身份证'; } }
3:然后再去体检
class Examination implements Entry { public function exec() { echo '我去入职体检'; } }
4:还需要离职证明呢
class LeaveProve implements Entry { public function exec() { echo '准备离职证明'; } }
二:资料准备完了,提交资料(客户端获取结果)
echo '开始提交资料';
$IdCard = new IdCard();
$IdCard->exec();
$Examination = new Examination();
$Examination->exec();
$LeaveProve = new LeaveProve();
$LeaveProve->exec();
echo '提交资料结束';
三:分析
- 我们发现,客户端(公司),更关心的是你准备的结果,而不是你准备的过程。
- 换成系统来看的话,客户端(公司)和多个子系统(准备过程)交互,同时大大增加了难度,想想,如果什么东西都需要公司去关心,那得忙成什么样子,流程变了怎么办呢?
- 外观模式定义:
- 外观模式定义了一个高层的功能,为子系统中的多个模块协同的完成某种功能需求提供简单的对外功能调用方式,使得这一子系统更加容易被外部使用。
- 简单来说,就是对外定义公共的访问接口,同时隐藏内部逻辑,这样即使子系统产生了逻辑修改,也可以非常方便安全的去维护。
四:重构
1:有了上面的思想,那么我们就为这个地方封装一个 门面/外观
public class AllExec() { public function exec { echo '开始办理手续...'; $IdCard = new IdCard(); $IdCard->exec(); $Examination = new Examination(); $Examination->exec(); $LeaveProve = new LeaveProve(); $LeaveProve->exec(); echo '手续终于办完了'; } }
2:当公司(客户端)找我们要资料时
$AllExec = new AllExec(); $AllExec->exec();
五:总结
- 外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。
六:Github地址