这篇文章主要介绍关于php中代理模式的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
代理模式属于结构性设计模式,针对类与对象组合在一起的经典结构。代理模式也是一种使用较多的设计模式,需要我们重点掌握,他可以在不改变目标对象的情况下,添加一些额外的功能。
<强> 强>
目前系统关于用户登录注册的业务,有一个登录类。伪代码如下:
类UserLogin {//÷允粜院筒糠址椒? 公共功能登录(名称,通过美元) {//登录业务 } 公共函数注册(名称,通过美元) {//注册业务 } }
现在,我们想在用户登录和注册的业务中添加一个功能,限流,让客户端调用该方法的频次限制在一秒钟最多5次。现在,我们来实现该功能,伪代码如下:
类UserLogin {//÷允粜院筒糠址椒? 公共功能登录(名称,通过美元) {//限流 限制=new限制美元(); 如果(限制→美元限制()){//? }//登录业务 } 公共函数注册(名称,通过美元) {//限流 限制=new限制美元(); 如果(限制→美元限制()){//? }//注册业务 } }
大家看看上面的代码,它有几个问题,首先,限流代码侵入到业务代码中,跟业务代码高度耦合。其次,限流和业务代码无关,违背单一职责原则。
<强> 强>
接下来,我们用代理模式重写上面的代码,重写后的代码如下所示:
IUserLogin接口 { 登录()函数; 注册()函数; } 类UserLogin实现IUserLogin {//÷允粜院筒糠址椒? 公共函数注册(uname,通过美元) {//注册业务 } 公共功能登录(uname,通过美元) {//登录业务 } } 类UserLoginProxy实现IUserLogin { 私人限制美元=零; 私人美元登录=零; 公共函数__construct(限制美元限制,登录登录美元) { 这→美元限制=$限制; $ this→登录=$登录; } 公共功能登录(uname,通过美元) { if ($ this→→限制限制()){//? } 返回$ this→登录→登录(uname,通过美元); } 公共函数注册(uname,通过美元) { if ($ this→→限制限制()){//? } 返回$ this→登录→注册(uname,通过美元); } }
上面的方法是基于接口而非实现编程的设计思想,但如果原始类并没有定义接口,或者这个类并不是我们开发和维护的,那么要怎么实现代理模式呢?
对于这种外部类的扩展,我们一般采用继承的方法来实现。
类UserLogin { 公共函数注册(uname,通过美元) {//注册业务 } 公共功能登录(uname,通过美元) {//登录业务 } } 类UserLoginProxy延伸登录 { 私人限制美元=零; 公共函数__construct(限制美元限制,登录登录美元) { 这→美元限制=$限制; $ this→登录=$登录; } 公共功能登录(uname,通过美元) { if ($ this→→限制限制()){//? } 返回父:登录(uname,通过美元); } 公共函数注册(uname,通过美元) { if ($ this→→限制限制()){//? } 返回父:注册(uname,通过美元); } }
大家看看上面的代码,是不是还有什么问题吗?你会发现
如果($ this→→限制限制()){//? }
这段相似的代码,出现了两次。现在我们只是给两个方法添加了限流功能,如果UserLogin类有10个方法,每个方法我们都想要添加限流的功能,那么我们就需要重复复制10次该段代码。如果,我们想要给10给类中所有方法都添加限流功能,每个类中都有10个方法,那么上面的限流代码将会重复100次。
当然,你会说我可以将限流的代码封装到一个函数里不就解决了上述问题么?但还有一个问题解决不了,原始类里每个方法在代理类中都要重新实现一遍。就像上面原始类里有注册,登录方法,代理类里也有注册,登录方法。