1. 什么是代理模式?

代理模式是一种结构型设计模式,它允许通过代理对象来控制对真实对象的访问,以提供额外的功能或控制访问权限。

2. 代理模式的作用是什么?

代理模式可以为对象提供保护代理、远程代理、虚拟代理和智能引用四种不同的实现方式,以适应不同的应用场景。代理模式还可以用于延迟对象的创建和初始化,提高系统的性能和响应速度。

3. 代理模式的优点是什么?

代理模式可以提高代码的模块化和可维护性,将客户端代码和被代理对象解耦,降低系统的耦合度。代理模式还可以对对象进行透明处理,让使用者感觉不到代理的存在。

4. 代理模式的缺点是什么?

代理模式的缺点是可能会降低系统的性能和增加内存消耗,因为需要通过代理对象来访问真实对象。另外,在一些情况下需要特别注意保护代理的安全性,避免被恶意攻击。

5. 代理模式的适用场景是什么?

代理模式可以应用于网络通信、缓存处理、权限控制等多种场景,例如:

- 网络通信中的远程代理。
- 对象缓存中的虚拟代理。
- 访问控制中的保护代理。
- 对象生成和初始化时的延迟代理。
- 对象的复杂操作和事务管理中的智能引用代理。

6. 代理模式的实现方式有哪些?

代理模式的实现方式有静态代理和动态代理两种。静态代理需要手动编写代理类,而动态代理可以在运行时动态生成代理类,更加灵活和可扩展。C#中,静态代理可以使用实现接口或继承基类的方式实现,而动态代理则可以使用库函数或Emit技术进行实现。


以下是一个简单的C#代码示例,演示了如何使用静态代理来实现对一个Math类的加减乘除操作进行日志记录和权限验证:

// 接口定义Math操作
public interface IMath
{
int Add(int x, int y);
int Subtract(int x, int y);
int Multiply(int x, int y);
int Divide(int x, int y);
} // 实现Math操作类
public class Math : IMath
{
public int Add(int x, int y)
{
return x + y;
} public int Subtract(int x, int y)
{
return x - y;
} public int Multiply(int x, int y)
{
return x * y;
} public int Divide(int x, int y)
{
return x / y;
}
} // 实现Math操作的代理类
public class MathProxy : IMath
{
private Math math = new Math(); // 记录日志的方法
private void Log(string message)
{
Console.WriteLine("[Log] " + message);
} // 验证权限的方法
private bool CheckPermission()
{
Console.WriteLine("Checking permission...");
return true;
} public int Add(int x, int y)
{
Log("Add " + x + " and " + y + ".");
if (CheckPermission())
{
return math.Add(x, y);
}
else
{
Console.WriteLine("Permission denied.");
return 0;
}
} public int Subtract(int x, int y)
{
Log("Subtract " + y + " from " + x + ".");
if (CheckPermission())
{
return math.Subtract(x, y);
}
else
{
Console.WriteLine("Permission denied.");
return 0;
}
} public int Multiply(int x, int y)
{
Log("Multiply " + x + " and " + y + ".");
if (CheckPermission())
{
return math.Multiply(x, y);
}
else
{
Console.WriteLine("Permission denied.");
return 0;
}
} public int Divide(int x, int y)
{
Log("Divide " + x + " by " + y + ".");
if (CheckPermission())
{
return math.Divide(x, y);
}
else
{
Console.WriteLine("Permission denied.");
return 0;
}
}
} // 客户端代码
class Client
{
static void Main(string[] args)
{
IMath math = new MathProxy(); Console.WriteLine("10 + 5 = " + math.Add(10, 5));
Console.WriteLine("10 - 5 = " + math.Subtract(10, 5));
Console.WriteLine("10 * 5 = " + math.Multiply(10, 5));
Console.WriteLine("10 / 5 = " + math.Divide(10, 5));
}
}

在这个示例中,我们创建了一个Math类作为被代理对象,并根据需要添加了日志记录和权限验证的功能。然后我们创建了一个MathProxy类作为静态代理对象,通过实现IMath接口并保存一个Math对象的引用来实现对Math类的操作。MathProxy类实现了IMath接口,所有的操作都由MathProxy类进行实现,可以在其中添加日志和权限验证等功能,并在需要时调用Math类的对应方法进行实际操作。

输出结果如下:

```
[Log] Add 10 and 5.
Checking permission...
10 + 5 = 15
[Log] Subtract 5 from 10.
Checking permission...
10 - 5 = 5
[Log] Multiply 10 and 5.
Checking permission...
10 * 5 = 50
[Log] Divide 10 by 5.
Checking permission...
10 / 5 = 2
```

可以看到,在客户端调用MathProxy类的操作时,实际上是由MathProxy类实现的,并添加了日志和权限验证的功能。由于MathProxy类实现了IMath接口,并保存了一个Math对象的引用,因此可以在需要时调用Math类的操作进行实际操作。这样可以将客户端代码和Math类解耦,并添加额外的功能。

C#设计模式12——代理模式的写法的更多相关文章

  1. [设计模式] 12 代理模式 proxy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...

  2. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  3. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  4. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  5. 设计模式之代理模式之二(Proxy)

    from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy)   0.前言 在前 ...

  6. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  7. GOF23设计模式之代理模式

    GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问.可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Asp ...

  8. C#设计模式:代理模式(Proxy Pattern)

    一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...

  9. js设计模式——1.代理模式

    js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...

  10. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

随机推荐

  1. [GDOI22pj1A] 邹忌讽秦王纳谏

    时间空间限制: 1 秒, 256 MB 齐国人邹忌对齐国国君齐威王说,大王身边的人会因为私情.利益等原因而对大王阿谀奉承,所以不能光听好话,只有广泛接受群众的批评意见,才不会被蒙蔽双眼,齐国才能强盛. ...

  2. K8s 里如何优雅地使用 /dev/shm 实现容器间共享内存

    目录 1. 从 docker run 的 --shm-size 参数聊起 2. Linux 里的 /dev/shm 3. Docker 对共享内存的支持 4. K8s 里如何设置 /dev/shm 大 ...

  3. C++ Qt开发:Charts折线图绘制详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts ...

  4. 华企盾DSC导致导出文件报错常见处理方法

    1.导出文件的进程和打开该文件的进程启用OLE控制是否都是未勾选,以及启用虚拟重定向是否设置一致(要么都勾选要么都不勾) 2.用procmon监控个人模式下导出非加密的文件,搜索writefile的进 ...

  5. Windows系统修复(System Update Readiness Tool、SFC模式、DISM命令)可解决系统更新问题。

    安装System Update Readiness Tool 提供此更新是因为在 Windows servicing store 中发现了不一致,这可能会影响将来成功安装更新.service pack ...

  6. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 12.认识GamePlayTag, 实现技能的互斥

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章对应Lecture 17 - GameplayTags, 67.67节.本文将会讲述UE4中Gamepl ...

  7. tmux 增加历史回滚缓冲区 buffer

    tmux 默认回滚 2000 行,如果要查看更多记录(比如编译报错)可以在.tmux.conf文件中增加一行 set -g history-limit 5000 重启 tmux session 生效

  8. 文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题

    文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题 二.试说明 MAX-HEAP-INSERT(A,10)在堆A=(15,13,9,5,12,8,7,4,0,6,2,1 ...

  9. 如何通过Python将JSON格式文件导入redis?

    摘要:如果希望将 JSON 文件导入到 Redis 中,首先要做的就是连接到 redis 服务. 本文分享自华为云社区<Python将JSON格式文件导入 redis,多种方法>,作者: ...

  10. 遇到联邦计算数据碰撞难题怎么办?不妨试一试PSI

    摘要:随着MPC.隐私计算等概念的流行,诸多政府机构.金融企业开始考虑参与到多方计算的场景中,扩展数据的应用价值. 本文分享自华为云社区<使用PSI解决联邦计算的数据碰撞问题>,作者:br ...