代理模式的统一建模语言(UML)图
代理模式的LePUS3建模语言（英语：） (图例)
**代理模式**（英語：）是程式設計中的一種設計模式。

所謂的代理者是指一個類別可以作為其它東西的介面。代理者可以作任何東西的介面：網路連接、記憶體中的大物件、檔案或其它昂貴或無法複製的資源。

著名的代理模式例子為參照計數（英語：）指標物件。

當一個複雜物件的多份副本須存在時，代理模式可以結合享元模式以減少記憶體用量。典型作法是建立一個複雜物件及多個代理者，每個代理者會參照到原本的複雜物件。而作用在代理者的運算會轉送到原本物件。一旦所有的代理者都不存在時，複雜物件會被移除。

示例
--

### Java

以下Java範例解釋"虛擬代理"模式。`ProxyImage` 類別用來存取遠端方法。

```
import java.util.\*;
 
interface Image {
 public void displayImage();
}

//on System A 
class RealImage implements Image {
 private String filename;
 public RealImage(String filename) { 
 this.filename = filename;
 loadImageFromDisk();
 }

 private void loadImageFromDisk() {
 System.out.println("Loading "+ filename);
 }

 public void displayImage() { 
 System.out.println("Displaying "+ filename); 
 }
}

//on System B 
class ProxyImage implements Image {
 private String filename;
 private Image image;
 
 public ProxyImage(String filename) { 
 this.filename = filename; 
 }
 public void displayImage() {
 if(image == null)
 image = new RealImage(filename);
 image.displayImage();
 }
}
 
class ProxyExample {
 public static void main(String[] args) {
 Image image1 = new ProxyImage("HiRes\_10MB\_Photo1");
 Image image2 = new ProxyImage("HiRes\_10MB\_Photo2"); 
 
 image1.displayImage(); // loading necessary
 image2.displayImage(); // loading necessary
 }
}

```

程式的輸出為：

```
Loading    HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Loading    HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2
```

### C#

```
using System;

namespace Proxy
{
 class Program
 {
 interface IImage
 {
 void Display();
 }

 class RealImage : IImage
 {
 public RealImage(string fileName)
 {
 FileName = fileName;
 LoadFromFile();
 }

 private void LoadFromFile()
 {
 Console.WriteLine("Loading "+ FileName);
 }

 public String FileName { get; private set; }

 public void Display()
 {
 Console.WriteLine("Displaying "+ FileName);
 }
 }

 class ProxyImage : IImage
 {
 public ProxyImage(string fileName)
 {
 FileName = fileName;
 }

 public String FileName { get; private set; }

 private IImage image;

 public void Display()
 {
 if (image == null)
 image = new RealImage(FileName);
 image.Display();
 }
 }

 static void Main(string[] args)
 {
 IImage image = new ProxyImage("HiRes\_Image");
 for (int i = 0; i < 10; i++)
 image.Display();
 }
 }
}

```

程式的輸出為：

```
Loading HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
Displaying HiRes_Image
```

另見
--

* 組合模式
* 修飾模式
* 惰性初始模式

外部連結
----

* Java 中的代理模式
* UML 和 LePUS3 （一種形式塑模語言）中的代理模式
* 以代理模式掌控大局
* PerfectJPattern 開源計劃（页面存档备份，存于），提供 Java 中代理模式的元件實作。

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
软件设计模式 |
| --- |
|  |
| 设计模式 | 

|  |  |
| --- | --- |
| 创建型 | 
* 抽象工厂
* 生成器
* 工厂方法
* 惰性初始
* 原型
* 单例

 |
|  |
| 结构型 | 
* 适配器
* 桥接
* Composite（英语：）
* 修饰
* 外观
* 享元
* 代理

 |
|  |
| 行为型 | 
* 责任链
* 命令
* Interpreter（英语：）
* 迭代器
* 中介者
* Memento（英语：）
* 观察者
* Specification（英语：）
* State（英语：）
* 策略
* 模板方法
* 访问者

 |

 |
|  |
| 并行模式 | 
* 主动对象（英语：）
* 阻止（英语：）
* Binding properties（英语：）
* 双重检查锁定模式
* 异步方法调用
* Future与promise
* Guarded suspension（英语：）
* Join（英语：）
* 锁
* Messaging（英语：）
* 监视器
* Proactor（英语：）
* 反应器
* 读写锁
* 调度
* 线程池
* 线程局部存储

 |
|  |
| 架构模式 | 
* ADR（英语：）
* 主动记录
* Broker（英语：）
* 主從式架構
* cbd
* DAO
* DDD
* Data transfer object（英语：）
* Front controller（英语：）
* Identity map（英语：）
* Interceptor（英语：）
* 控制反转
* MVC
* 微服務
* MVP
* 單體式應用程式
* 多层架构
* *n*-tier（英语：）
* Naked objects（英语：）
* P2P
* 发布/订阅
* REST
* SOA
* Specification（英语：）

 |
|  |
| 云分布式 | 
* 断路器
* CQRS（英语：）
* 补偿交易（英语：）
* 索引表
* 领导者选举（英语：）
* MapReduce
* 物化视图（英语：）
* 管道
* 过滤器（英语：）
* 发布/订阅
* 分片（英语：）
* 节流（英语：）

 |
|  |
| 其他模式 | 
* Blackboard（英语：）
* Business delegate（英语：）
* Composite entity（英语：）
* 委托
* 依赖注入
* Intercepting filter（英语：）
* 惰性載入
* Method chaining（英语：）
* 模拟对象
* 空对象
* 对象池
* Servant（英语：）
* Twin（英语：）
* Type tunnel（英语：）

 |
|  |
| 书籍 | 
* 设计模式：可复用面向对象软件的基础
* 企业集成模式（英语：）

 |
|  |
| 人物 | 
* 克里斯托佛·亚历山大
* 埃里希·伽瑪
* Ralph Johnson（英语：）
* John Vlissides（英语：）
* 葛來迪·布區
* 肯特·貝克
* 沃德·坎宁安
* 马丁·福勒
* Robert Martin（英语：）
* Jim Coplien（英语：）
* Douglas Schmidt（英语：）
* Linda Rising

 |
|  |
| 社区 | 
* The Hillside Group（英语：）
* The Portland Pattern Repository（英语：）

 |

 |