一文详解什么是代理模式

微信公众号:云计算通俗讲义

持续输出技术干货,欢迎关注!

通过本文你将了解:

  • 背景

  • 概述

  • 模式结构

  • 代码实现

  • 特点

  • 应用场景

背景

在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的动机。

概述

代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。

模式结构

代理模式包含如下角色:

Subject: 抽象主题角色

抽象主题角色声明了真实主题和代理主题的共同接口,实现了调用方和服务方的解耦。

Proxy: 代理主题角色

代理主题角色内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象。

RealSubject: 真实主题角色

真实主题角色定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。

1240

代码实现


//抽象系统类
class AbstractCommonInterface{
public:
  virtual void run() = 0;
};

class MyFunc :public AbstractCommonInterface{
public:
  virtual void run(){
    cout << "run..." << endl;
  }
};

class MrFuncProxy:public AbstractCommonInterface{
public:
  MyFunc*pFunc;
  string mUserInfo;

public:
  MrSystemProxy(string userInfo){
    this->mUserInfo = userInfo;
    pFunc = new MyFunc;
  }
  ~MyFuncProxy(){
    if (NULL != pFunc) {
      delete pFunc;
    }
  }

  virtual void run(){
    if (checkUserInfo()){
      cout << "user info is right." << endl;
      this->pFunc->run();
    }
    else{
      cout << "error." << endl;
    }
  }

};
void ProxyFunc() {
  MyFuncProxy* proxy = new MyFuncProxy("root,123");
  proxy->run();
  delete proxy;

  proxy = new MyFuncProxy("admin,123");
  proxy->run();
  delete proxy;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

特点

优点

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

保护代理可以控制对真实对象的使用权限。

缺点

额外增加了代理层,可能造成请求的请求响应变慢。

需要额外增加代理层的实现逻辑,可能会比较复杂。

应用场景

图片代理

在Web中浏览大图一般使用图片代理实现,即用户访问某大图时不时直接加载该图片,这样会很消耗网络带宽,而是采用先向客户端浏览器加载一个小图,然后在后台加载大图,这样可以大幅度提升用户体验。

远程代理

远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。

虚拟代理

虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。

### Vision Transformer (ViT) 的详细解释、原理、架构与实现 #### ViT 的核心概念 Vision Transformer 是一种基于 Transformer 架构的深度学习模型,其设计初衷是为了处理视觉任务。传统的卷积神经网络(CNNs)主导了计算机视觉领域多年,然而随着自然语言处理中 Transformer 的成功应用,研究者们尝试将其扩展到图像识别等领域。ViT 将图像分割成固定大小的小块(patches),并通过线性变换将这些小块映射为一维向量序列[^1]。 #### 图像预处理流程 在实际应用中,输入的高分辨率图像会被划分为多个不重叠的小块(flattened patches)。每个 patch 被视为独立的 token,并通过一个可训练的线性层投影至统一维度的空间。这一过程被称为 **Linear Projection of Flattened Patches**,它是 ViT 模型的关键部分之一[^3]。 #### 自注意力机制的作用 自注意力机制允许模型动态调整不同区域的重要性权重,从而捕捉全局依赖关系。相比于 CNN 中局部感受野的设计理念,Transformer 可以一次性关注整个输入序列,这使得它更适合建模复杂的长距离交互模式。具体来说,在编码器阶段,每个多头注意力模块会计算 query、key 和 value 向量之间的相似度得分,进而生成加权后的特征表示[^2]。 #### 位置嵌入的意义 由于原始 Transformer 设计用于处理顺序数据(如文本句子),因此需要引入额外的位置信息来保留 tokens 在原图中的空间布局特性。通常采用的方法是在输入 embedding 上叠加一组固定的正弦/余弦波形或者随机初始化并随时间优化得到的学习型参数作为绝对位置编码[^2]。 #### 整体架构描述 完整的 ViT 结构由以下几个组件构成: - 输入准备:把图片切分成若干个相同尺寸的patch; - Embedding 层:执行上述提到过的 flatten operation 加 linear transformation 得到初始 embeddings; - Positional Encoding 添加步骤; - 多层堆叠的标准 transformer encoder blocks —— 包含 multi-head self attention layer 和 feed forward network layers; - Classification head 输出最终预测类别概率分布。 以下是 Python 实现的一个简化版例子: ```python import torch from torch import nn, optim class PatchEmbedding(nn.Module): def __init__(self, img_size=224, patch_size=16, embed_dim=768): super().__init__() num_patches = (img_size // patch_size)**2 self.patch_embeddings = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.patch_embeddings(x).flatten(2).transpose(1, 2) return x class MultiHeadAttention(nn.Module): pass # Implementation omitted for brevity. class EncoderBlock(nn.Module): pass # Implementation omitted for brevity. class VisionTransformer(nn.Module): def __init__(self,...): ... model = VisionTransformer() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 以上代码片段仅展示了如何定义基本构建单元以及搭建整体框架的大致思路,并未包含全部细节内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值