97 lines
2.9 KiB
Markdown
97 lines
2.9 KiB
Markdown
|
||
|
||
### 代理模式 (Proxy Pattern) 详解
|
||
|
||
> 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理可以在不修改原始对象的情况下,增强或控制对它的访问。
|
||
|
||
#### 核心概念
|
||
|
||
装饰器模式主要解决以下问题:
|
||
|
||
- 控制访问:代理可以决定是否允许客户端访问目标对象(如权限控制)。
|
||
- 增强功能:代理可以在调用目标对象前后添加额外逻辑(如缓存、日志、延迟加载)。
|
||
- 远程访问:代理可以代表远程对象(如RPC、数据库访问)。
|
||
- 虚拟代理:代理可以延迟创建开销大的对象(如图片懒加载)。
|
||
|
||
#### 常见应用场景
|
||
- Spring AOP:通过动态代理实现切面编程
|
||
- MyBatis:Mapper接口的代理实现
|
||
- RPC框架:远程服务调用的本地代理
|
||
- 图片懒加载:先显示缩略图代理,点击再加载原图
|
||
|
||
|
||
```php
|
||
//error remote service
|
||
<?php
|
||
|
||
// 订单服务接口
|
||
interface OrderService {
|
||
public function createOrder(array $data): array;
|
||
}
|
||
|
||
// 本地服务实现
|
||
class LocalOrderService implements OrderService {
|
||
public function createOrder(array $data): array {
|
||
// 本地创建订单逻辑
|
||
return ['order_id' => 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);
|
||
}
|
||
}
|
||
|
||
``` |