代理模式定义

  • 顾名思义,代理模式就是使用代理的方式来访问具体对象,而不是直接访问对象。目的是提供一种代理也就是中间层来控制对真实对象的访问,使用代理方不需要关心真实对象内部的具体实现。
  • 举个例子,我们平常坐火车可以到火车站售票处进行购票,也可以到代售点购票,代售点可以理解是火车站的一个售票代理。假设火车站售票处有售票、退票、改签所有服务,但只允许代售点只能售票、退票,不支持改签操作。这里代售点就是一个代理。

UML类图

image.png

PHP 代码实现

<?php
interface ITicket
{
    public function buyTicket();
    public function returnTicket();
}

class Ticket implements ITicket
{
    public function buyTicket()
    {
        echo '购票';
    }

    public function returnTicket()
    {
        echo '退票';
    }

    public function changeTicket()
    {
        echo '改签';
    }
}

/**
 * 代理对象,代售点仅支持购票/退票
 */
class TicketProxy implements ITicket
{

    protected $ticket;
    public function __construct(Ticket $ticket)
    {
        $this->ticket = $ticket;
    }

    public function buyTicket()
    {
        $this->ticket->buyTicket();
    }

    public function returnTicket()
    {
        $this->ticket->returnTicket();
    }
}

$obj = new TicketProxy(new Ticket());
$obj->buyTicket();

使用场景

  • 远程代理。
  • 虚拟代理。
  • Copy-on-Write 代理。
  • 保护(Protect or Access)代理。
  • Cache代理。
  • 防火墙(Firewall)代理。
  • 同步化(Synchronization)代理。
  • 智能引用(Smart Reference)代理。

cyonks
22 声望1 粉丝

it's me