惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
量子位
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园_首页
IT之家
IT之家
V
Visual Studio Blog
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
D
Docker
V
V2EX

博客园 - 隴上煙雨劍

什么是交叉验证 一句话设计模式 中介模式 桥接模式 吐槽一下依赖倒置这个糟糕的名字 适配器模式 设计模式之状态模式 设计模式之装饰器模式 mysql插入数据如果存在则忽略 自己手写一个js的双向绑定 Java已经不再是以前的java了 无法访问9200端口的ElasticSearch服务 Forbidden You don't have permission to access / on this server [转帖]快速激活最新JetBrains公司系列产品包括最新的phpstorm10 【转】CI去掉index.php VirtualBox在win8.1中无法安装64位虚拟机 多谢Mono Ubuntu14.04上面安装mono3.12版本 更新线上数据库时候的安全操作
代理模式
隴上煙雨劍 · 2023-07-22 · via 博客园 - 隴上煙雨劍

通过引入一个代理对象(Proxy)来对实际的业务对象附加一定的逻辑——也就是说要不要调用真正的业务逻辑对象方法,由代理决定。

举个例子:CDN缓存其实就是一个代理——如果CDN网络中没有要访问的资源,那么回原站,如果有的话,就直接返回了。

看个例子吧。

 1 假设我们有一个网络资源下载器,我们想要在下载资源前检查用户是否有权限进行下载,以及记录下载日志。为了实现这些功能,我们可以使用代理模式。
 2 
 3 首先,我们定义一个抽象主题接口 IDownloader:
 4 
 5 
 6 public interface IDownloader
 7 {
 8     void Download(string url);
 9 }
10 
11 然后,我们实现真实主题类 RealDownloader,用于执行资源的下载:
12 
13 public class RealDownloader : IDownloader
14 {
15     public void Download(string url)
16     {
17         Console.WriteLine($"Downloading resource from {url}");
18     }
19 }
20 
21 接下来,我们实现代理类 ProxyDownloader,在下载资源之前进行权限检查和日志记录:
22 
23 public class ProxyDownloader : IDownloader
24 {
25     private RealDownloader realDownloader = new RealDownloader();
26 
27     public void Download(string url)
28     {
29         // 权限检查
30         if (CheckPermission())
31         {
32             // 记录日志
33             LogDownload(url);
34             // 执行下载
35             realDownloader.Download(url);
36         }
37         else
38         {
39             Console.WriteLine("Permission denied. Cannot download resource.");
40         }
41     }
42 
43     private bool CheckPermission()
44     {
45         // 这里模拟权限检查,假设用户有权限下载资源
46         return true;
47     }
48 
49     private void LogDownload(string url)
50     {
51         Console.WriteLine($"Downloading resource from {url} - {DateTime.Now}");
52     }
53 }
54 
55 
56 现在,我们可以使用代理模式来下载资源:
57 
58 class Program
59 {
60     static void Main(string[] args)
61     {
62         IDownloader downloader = new ProxyDownloader();
63         downloader.Download("https://www.example.com/resource.txt");
64     }
65 }
66 
67 通过代理模式,我们可以在下载资源前进行权限检查和记录下载日志,而无需修改真实主题类的代码。这样,代理模式为我们提供了一种方便的方式来添加额外功能或控制,同时保持原始对象的功能不受影响。