代理模式(Proxy Pattern)是一种结构型设计模式,它让一个类代表另外一个类的功能。在代理模式中,我们创建一个代理类,用于代表原始类的功能。
代理模式有两个角色:代理类和原始类。代理类和原始类都实现了同一个接口,这意味着客户端可以使用代理类的对象来代替原始类的对象。代理类实现了与原始类相同的方法,但是在代理类中,它们会执行一些额外操作,比如记录日志、缓存结果、控制访问等。
代理模式以各种方式实现,其中最常见的是通过在代理类中创建一个实例变量来引用原始类的对象。代理类中的方法通过实例变量来调用原始类中的方法。
golang实现
// Subject 接口定义了代理类和原始类的公共接口。
type Subject interface {
Request()
}
// RealSubject 是实际的对象类,它执行客户端需要的具体操作。
type RealSubject struct{}
func (s *RealSubject) Request() {
fmt.Println("RealSubject: Handling request.")
}
// Proxy 类是代理类,它接收客户端的请求并将请求传递给 RealSubject 对象。
type Proxy struct {
realSubject *RealSubject
}
func NewProxy() *Proxy {
return &Proxy{realSubject: &RealSubject{}}
}
func (p *Proxy) Request() {
// 在请求前或请求后执行其他操作。
fmt.Println("Proxy: Logging the time of request.")
// 将请求传递给 RealSubject 对象。
p.realSubject.Request()
// 在请求前或请求后执行其他操作。
fmt.Println("Proxy: Logging the response time.")
}
// 客户端代码
func main() {
proxy := NewProxy()
proxy.Request()
}
php实现
<?php
/**
* Subject 接口定义了代理类和原始类的公共接口。
*/
interface Subject
{
public function request(): void;
}
/**
* RealSubject 是实际的对象类,它执行客户端需要的具体操作。
*/
class RealSubject implements Subject
{
public function request(): void
{
echo "RealSubject: Handling request." . PHP_EOL;
}
}
/**
* Proxy 类是代理类,它接收客户端的请求并将请求传递给 RealSubject 对象。
* 它在此之前或之后执行其他操作,例如检测授权、记录日志等等。
*/
class Proxy implements Subject
{
/**
* @var RealSubject
*/
private $realSubject;
/**
* Proxy constructor.
* @param RealSubject $realSubject
*/
public function __construct(RealSubject $realSubject)
{
$this->realSubject = $realSubject;
}
public function request(): void
{
// 在请求前或请求后执行其他操作。
echo "Proxy: Logging the time of request." . PHP_EOL;
// 将请求传递给 RealSubject 对象。
$this->realSubject->request();
// 在请求前或请求后执行其他操作。
echo "Proxy: Logging the response time." . PHP_EOL;
}
}
// 客户端代码
$realSubject = new RealSubject();
$proxy = new Proxy($realSubject);
$proxy->request();
定义了一个Subject接口用于定义代理和原始类的通用方法,RealSubject类是实际对象执行操作的类。Proxy类代表RealSubject类,同时还添加了一些额外的功能,例如记录日志等。在客户端代码中,我们首先创建一个RealSubject对象,然后在创建一个Proxy对象,将RealSubject对象传递给它,最后通过Proxy对象调用request()方法。
代理模式的优点是可以更好地控制对象的生命周期,减少客户端和服务端的耦合度。同时,代理模式还可以实现缓存结果,这样在下次请求相同内容时,可以直接返回之前的结果,提高了整体性能。