### 代理模式 (Proxy Pattern) 详解 > 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理可以在不修改原始对象的情况下,增强或控制对它的访问。 #### 核心概念 装饰器模式主要解决以下问题: - 控制访问:代理可以决定是否允许客户端访问目标对象(如权限控制)。 - 增强功能:代理可以在调用目标对象前后添加额外逻辑(如缓存、日志、延迟加载)。 - 远程访问:代理可以代表远程对象(如RPC、数据库访问)。 - 虚拟代理:代理可以延迟创建开销大的对象(如图片懒加载)。 #### 常见应用场景 - Spring AOP:通过动态代理实现切面编程 - MyBatis:Mapper接口的代理实现 - RPC框架:远程服务调用的本地代理 - 图片懒加载:先显示缩略图代理,点击再加载原图 ```php //error remote service uniqid(), 'status' => 'created']; } } // 远程服务代理 class RemoteOrderServiceProxy implements OrderService { private $rpcClient; public function __construct() { $this->rpcClient = ApplicationContext::getContainer() ->get(\Hyperf\RpcClient\Proxy\AbstractProxyService::class); } public function createOrder(array $data): array { // 添加额外的元数据 $data['request_id'] = uniqid(); $data['timestamp'] = time(); // 记录请求日志 $logger = ApplicationContext::getContainer() ->get(\Hyperf\Logger\LoggerFactory::class) ->get('rpc'); $logger->info('Sending order creation request', $data); // 调用远程服务 try { $response = $this->rpcClient->__call('OrderService.createOrder', [$data]); $logger->info('Order created successfully', ['response' => $response]); return $response; } catch (\Throwable $e) { $logger->error('Order creation failed', ['error' => $e->getMessage()]); throw $e; } } } // 配置依赖 // config/autoload/dependencies.php return [ OrderService::class => RemoteOrderServiceProxy::class, // 使用远程代理 // 或者 // OrderService::class => LocalOrderService::class, // 使用本地服务 ]; // 在控制器中使用 class OrderController extends AbstractController { /** * @Inject * @var OrderService */ private $orderService; public function create() { $data = $this->request->all(); $result = $this->orderService->createOrder($data); return $this->response->json($result); } } ```