当前位置: 首页 > news >正文

实用指南:【结构型模式】代理模式

代理模式

在这里插入图片描述

什么是代理模式?

代理模式是结构型模式的基础,结构型模式通常用于类与类之间的组合场景当中。

通过代理模式能够为其他对象献出一种代理,以控制这个对象对其他类对象的访问。

一个典型的例子是,在「网络游戏」场景当中,我们作为玩家直接参与游戏进行升级可能较慢,这个时候可以依据代理(游戏代练)帮助我们升级,代理在帮助我们升级(完成我们本来要做的工作)的同时,还能够帮我们提升装备的质量(完成了额外的工作)。

代理模式中的角色和职责

代理模式的标准类图如下:

画板

代理模式的案例达成

参考《Easy 搞定 Golang 设计模式》,此处引入一个“海外购物”的例子来实现代理模式。

package main
import "fmt"
/* 以海外购物为主题, 实现代理模式 */
type Goods struct {
Kind string // 商品种类
Fact bool // 商品真伪
}
// ---------- 抽象层 ----------
// 定义一个抽象的购物主题
type Shopping interface {
Buy(goods *Goods)
}
// ---------- 实现层 ----------
// 实现具体的购物主题
type HainanShopping struct{
}
func (hs *HainanShopping) Buy(goods *Goods) {
fmt.Printf("去海南购物, 买了: %s\n"
, goods.Kind)
}
type ShouerShopping struct{
}
func (ss *ShouerShopping) Buy(goods *Goods) {
fmt.Printf("去首尔购物, 买了: %s\n"
, goods.Kind)
}
type JilongpoShopping struct{
}
func (js *JilongpoShopping) Buy(goods *Goods) {
fmt.Printf("去吉隆坡购物, 买了: %s\n"
, goods.Kind)
}
// 接下来实现一个“海外购物”的代理
type OverseaProxy struct {
shopping Shopping // 成员是抽象的接口类型, 这样就可以适配不同的具体主题
}
func (op *OverseaProxy) distinguish(goods *Goods) bool {
fmt.Printf("对[%s]进行了验货.\n"
, goods.Kind)
if !goods.Fact {
fmt.Printf("发现假货, 交易终止.\n"
)
}
return goods.Fact
}
func (op *OverseaProxy) check(goods *Goods) {
fmt.Printf("对[%s]进行了海关安检\n"
, goods.Kind)
}
func (op *OverseaProxy) Buy(goods *Goods) {
// 1. 先验货: PreRequest
if op.distinguish(goods) {
// 2. 验货成功, 购买: Request
op.shopping.Buy(goods)
// 3. 海关安检: PostRequest
op.check(goods)
}
}
// 创建一个代理, 并配置关联被代理的主题
func NewProxy(shopping Shopping) Shopping {
return &OverseaProxy{
shopping
}
}
func main(
) {
g1 := Goods{
Kind: "椰树牌椰汁"
,
Fact: true
,
}
g2 := Goods{
Kind: "猫山王榴莲"
,
Fact: true
,
}
// 不使用代理从海外购物
var shopping Shopping
shopping = &HainanShopping{
}
// 1. 先验货
if g1.Fact {
fmt.Printf("对[%s]进行了验货.\n"
, g1.Kind)
shopping.Buy(&g1)
fmt.Printf("对[%s]进行了海关安检.\n"
, g1.Kind)
}
// 使用代理模式购物
fmt.Println("---------- 使用代理进行购物 ----------"
)
var overseaProxy Shopping
overseaProxy = &OverseaProxy{
shopping
}
overseaProxy.Buy(&g1)
overseaProxy.Buy(&g2)
}

代理模式的优缺点

优点

  1. 能够协调调用者与被调用者,一定程度上降低了系统的耦合度。
  2. 客户端许可针对抽象主题角色进行编程,增加和更换代理无需修改源码,符合开闭原则,使系统具有较好的灵活性和可拓展性。

缺点

  1. 代理建立较为复杂。
http://www.gsyq.cn/news/16964.html

相关文章:

  • 深入解析:Kotlin 中companion object {} 什么时候触发
  • libopenssl-1_0_0-devel-1.0.2p RPM 包安装教程(openSUSE/SLES x86_64)​
  • API异常信息如何实时发送到钉钉 - 详解
  • 实用指南:解决 xmlsec.InternalError: (-1, ‘lxml xmlsec libxml2 library version mismatch‘)
  • 高质量同人动画整理回顾记录的方式
  • 加拿大加密货币牌照:合规化加速数字资产成功
  • 【Hexo】4.Hexo 博客文章进行加密 - 实践
  • 思考的动力
  • 星闪开发之Server-Client 指令交互控制OLED灯案例 - 教程
  • Baklib内容中台AI重构智能服务 - 实践
  • 计算机网络学习分享-0
  • 预科02git使用
  • 预科01Python学习
  • 实用指南:用PyTorch从零开始编写DeepSeek-V2
  • 博客迁移到CSDN!!!
  • 手动实现一个C++绑定Lua脚本的库
  • 图解C++智能指针的循环引用
  • 详细介绍:在机器视觉测量和机器视觉定位中,棋盘格标定如何影响精度
  • 题解:P11219 【MX-S4-T3】「yyOI R2」youyou 的序列 II
  • 前端HTML contenteditable 属性使用指南 - 教程
  • C++ list数据删除、list资料访问、list反转链表、list数据排序
  • DP分析黑科技——闫氏DP分析法
  • MUGEN游戏引擎等一系列相关杂谈
  • # 20232313 2025-2026-1 《网络与系统攻防技术》实验一实验报告 - 20232313
  • 完整教程:【无标题】
  • vector使用中的一个小问题
  • 一生一芯学习:PA2:输入输出
  • 深入解析:人工智能-Chain of Thought Prompting(思维链提示,简称CoT)
  • 年龄排序
  • 二分图最大匹配 输出具体方案