c# - 了解 C# 中的代理模式

标签 c# proxy-pattern

假设我尝试通过像这样的其他类访问类的方法

class SuperClass
    {
        public interface ISubject
        {
            void Print();
        }
        private class Subject : ISubject
        {
            public void Print()
            {
                Console.WriteLine("this is a print");
            }
        }
       public class Proxy {
            ISubject subject;
            public void CallOtherMethod() {
                subject = new Subject();
                subject.Print();
            }
        }
    }
    class Client: SuperClass
    {
        static void Main() {
            Proxy proxy = new Proxy();
            proxy.CallOtherMethod();
        }
    } 

这被称为代理类吗?或者是否需要有一个接口(interface)作为引用然后我们必须调用该方法?例如像这样

class SuperClass
    {
        public interface ISubject
        {
            void Print();
        }
        private class Subject : ISubject
        {
            public void Print()
            {
                Console.WriteLine("this is a print");
            }
        }
        public class Proxy : ISubject
        {
            ISubject subject;
            public void Print()
            {
                subject = new Subject();
                subject.Print();
            }
        }
    }
    class Client : SuperClass
    {
        static void Main()
        {
            ISubject proxy = new Proxy();
            proxy.Print();
        }
    }

最佳答案

通常,代理模式的目的是拦截。也就是说,捕获对某种类型的某些(或全部)方法的调用,并在实际调用之前/之后执行某些操作。为了实现这一点,代理必须继承目标类型。

例如:

public class Subject
{
    public virtual void Print()
    {
        Console.WriteLine("this is a print");
    }
}

public class SubjectProxy : Subject
{
    public override void Print()
    {
        Console.Write("Before calling base.Print()");
        base.Print();
        Console.Write("After calling base.Print()");
    }
}

现在,当您在代码中的某个时刻您期望 Subject 时, ,你实际上可能会得到 SubjectProxy并仍然将其视为 Subject :

public Subject GetSubject()
{
    return new SubjectProxy();
}

Subject subject = GetSubject();
subject.Print(); // would use the proxied method

(这并不是说实现拦截的唯一方法是通过继承。我认为有一些代理风格使用组合/装饰的变体来实现这一点)

关于c# - 了解 C# 中的代理模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605725/

相关文章:

c# - 为 SqlBulkCopy 中的某些列设置常量值

c# - Unity如何正确获取字符宽度

c# - FFmpeg C# 视频转换

swift - 在 Swift 4.1 中使用 NSProxy

python - 使用 OOP 和代理模式的字符串构造

.net - 代理模式和适配器模式的区别?

c# - 为什么我们应该在 EntityFramework 中禁用自动迁移

c# - ASP.Net C# AssemblyInfo 版本不工作

android - 如何使用(智能引用)代理设计模式实现缓存机制?

design-patterns - 为什么是代理模式是结构模式,为什么是状态模式是行为模式?