首页 > 编程语言 > C#设计模式11——代理模式的写法

C#设计模式11——代理模式的写法

时间:2023-05-09 21:34:35浏览次数:38  
标签:11 10 return C# 代理 int 设计模式 public Math

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类解耦,并添加额外的功能。

标签:11,10,return,C#,代理,int,设计模式,public,Math
From: https://www.cnblogs.com/for-easy-fast/p/17386364.html

相关文章

  • Docker CLI docker compose rm常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • CF1825D1 题解
    一、题目描述:给定$n$和$k$,表示有$n$个点,其中有$k$个点是关键点,这$k$个点随机分布。给出$n$个点的连接方式,保证构成一棵树,求有期望多少个点使得这个点到$k$个关键点的距离之和最小,答案对$1e9+7$取模。数据范围:$1\leqn\leq2e5,1\leqk\leqmin(n,3)......
  • C++异常和错误处理机制:如何使您的程序更加稳定和可靠
    在C++编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C++中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当程序试图访问一......
  • Personalized Top-N Sequential Recommendation via Convolutional Sequence Embeddin
    目录概符号说明Caser代码TangJ.andWangK.Personalizedtop-nsequentialrecommendationviaconvolutionalsequenceembedding.WSDM,2018.概序列推荐的经典之作,将卷积用在序列推荐之上.符号说明\(\mathcal{U}=\{u_1,u_2,\cdots,u_{|\mathcal{U}|}\}\),us......
  • C#设计模式10——享元模式的写法
    1.什么是享元模式?享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量。它通过将对象分为可共享的和不可共享的来实现这一目的。2.为什么要使用享元模式?使用享元模式可以大大减少系统中对象的数量,从而减少了内存的使用。在对象数量较大,且需要相同状......
  • React笔记-组件(一)
    React学习笔记-组件(一未完成)特点声明式组件化跨平台React脚手架a.全局安装react脚手架create-react-appnpminstallcreate-react-app-g&npxcreate-react-appmy-appb.使用create-react-app创建react应用,如果直接使用npx则无需执行这一步,直接执行第3步c......
  • React笔记-事件(三)
    React学习笔记-事件(三)定义事件React元素的事件处理和DOM元素的很相似但是有一点语法上的不同React事件的命名采用小驼峰式(camelCase)而不是纯小写如点击事件onClickimportReactfrom'react'exportdefaultclasslearnEventextendsReact.Component{///......
  • React笔记-样式(二)
    React学习笔记-样式(二)内联样式importReactfrom"react";exportdefaultclassLearnStyleextendsReact.Component{render(){return(<div>{/*以下两种方法都可以一种不用引号将css以小驼峰方式写另一种加上引号写......
  • 学习JavaScript数据结构与算法 第八章
    八,字典和散列表8.3ES2015Map类ECMAScript2015新增了Map类。constmap=newMap();map.set('Gandalf','[email protected]');map.set('John','[email protected]');map.set('Tyrion','[email protected]');......
  • React笔记-渲染列表Key(五)
    React学习笔记-渲染列表Key(五)渲染列表需要添加key属性importReactfrom"react"exportdefaultclassLearnKeyextendsReact.Component{state={infos:[{name:'Bob',age:18},{name:'kitty',age:20},{name:......