首页 > 其他分享 >代理模式

代理模式

时间:2023-07-22 22:55:05浏览次数:22  
标签:string IDownloader url void 代理 模式 下载

通过引入一个代理对象(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 通过代理模式,我们可以在下载资源前进行权限检查和记录下载日志,而无需修改真实主题类的代码。这样,代理模式为我们提供了一种方便的方式来添加额外功能或控制,同时保持原始对象的功能不受影响。

 

标签:string,IDownloader,url,void,代理,模式,下载
From: https://www.cnblogs.com/yanyuge/p/17574475.html

相关文章

  • 桥接模式
    桥接模式说的是本来面向接口编程,但是呢,我们定义接口的时候吧,要考虑单一职责,所以不能眉毛胡子一把抓。另外呢,在有些场景下,如果一个类的变化维度比较多(比如绘图中有颜色和形状这两个维度),那么使用继承会导致类爆炸,所以呢,搭个桥,组装一下。晕了吧,看看代码:publicinterfaceShape{......
  • 适配器模式
    适配器模式(AdapterPattern)说白了就是把一个接口实现类转换成另外一个接口对象。先看代码:1//目标接口2publicinterfaceITarget3{4voidRequest();5}67//原本不兼容的类8publicclassAdaptee9{10publicvoidSpecificRequest()11......
  • 设计模式之状态模式
    假设我们正在开发一个网络下载器应用,该应用有不同的下载状态,包括未下载状态、下载中状态、下载完成状态和下载失败状态。我们可以使用状态模式来管理下载器的状态和行为。要是不用状态模式,这还真的就乱套了!看下代码吧。1//抽象状态类-下载状态2publicabstractclas......
  • 设计模式之装饰器模式
    装饰器模式是一种结构型设计模式,它允许动态地为对象添加新的行为,同时不改变其结构。通过将对象包裹在一个装饰器中,可以在运行时为对象添加额外的功能。在装饰器模式中,有四个主要角色:抽象组件(Component):定义了被装饰对象的接口,是装饰器和被装饰对象的共同基类或接口。它声明了一组......
  • Centos 7 单用户模式修改密码/配置
    1、启动系统,启动项界面显示时,按“↑↓”键停留在此界面,按下“e”键进入编辑模式2、利用“↑↓”键找到“linux16”开头的那段,去掉“rhgb”和“quiet”参数,并在“UTF-8”之后添加“init=/bin/sh”3、修改后,按“Ctrl+X”重启系统4、修改根目录的修改权限,并重新挂载(默认只读,不......
  • redis主从模式修改密码
    Redis主从模式修改密码概述在Redis主从模式中,需要修改密码时,需要在主节点上修改密码,并且同步到所有的从节点上。下面将详细介绍如何实现这个过程。修改密码流程下面是修改Redis主从模式密码的流程:步骤描述步骤1连接到主节点步骤2修改主节点密码步骤3获取从......
  • 建造者模式
    建造者模式一场景    在软件开发中,我们有时候会创建一些复杂的对象,这些对象有着复杂的内部结构,它们都是有一系列部件组成。这些部件相互依赖,而且部件的构建通常面临着复杂的变化。我们需要先按照一定的顺序来创建各个部件,最后将这些部件组装成一个完整的对象。  ......
  • Unity编辑模式 一键获取Tilemap的格子信息
    动机由于地图是使用unitytilemap编辑的,服务端也希望获取一份相关的信息。相较于自己写个编辑器,直接利用unity的能力会更加敏捷。效果展示只需要将组件拖拽到含有Tilemap组件的GameObj上面,就可以点击按钮,获取格子信息。源码展示[CustomEditor(typeof(TilemapTool))][CanEdi......
  • ofstream 追加模式
    #includeusingnamespacestd;intmain(){ofstreamoutfile("example.txt",ios::app);if(outfile.is_open()){outfile<<"Thisisanewline.\n";outfile.close();}elsecout<<"Una......
  • 修改MySQL读写模式
    修改MySQL读写模式MySQL是一个开源的关系型数据库管理系统,广泛应用于互联网应用和企业级应用中。在MySQL中,存在着读写模式的设置,可以根据实际需求来调整数据库的读写性能和一致性。本文将介绍如何修改MySQL的读写模式,并提供代码示例。1.了解MySQL读写模式在MySQL中,有两种常见的......