namespaceRefactoringGuru.DesignPatterns.Proxy.Conceptual { // The Subject interface declares common operations for both RealSubject and // the Proxy. As long as the client works with RealSubject using this // interface, you'll be able to pass it a proxy instead of a real subject. publicinterfaceISubject { voidRequest(); }
// The RealSubject contains some core business logic. Usually, RealSubjects // are capable of doing some useful work which may also be very slow or // sensitive - e.g. correcting input data. A Proxy can solve these issues // without any changes to the RealSubject's code. classRealSubject : ISubject { publicvoidRequest() { Console.WriteLine("RealSubject: Handling Request."); } }
// The Proxy has an interface identical to the RealSubject. classProxy : ISubject { private RealSubject _realSubject;
// The most common applications of the Proxy pattern are lazy loading, // caching, controlling the access, logging, etc. A Proxy can perform // one of these things and then, depending on the result, pass the // execution to the same method in a linked RealSubject object. publicvoidRequest() { if (this.CheckAccess()) { this._realSubject.Request();
this.LogAccess(); } }
publicboolCheckAccess() { // Some real checks should go here. Console.WriteLine("Proxy: Checking access prior to firing a real request.");
returntrue; }
publicvoidLogAccess() { Console.WriteLine("Proxy: Logging the time of request."); } }
publicclassClient { // The client code is supposed to work with all objects (both subjects // and proxies) via the Subject interface in order to support both real // subjects and proxies. In real life, however, clients mostly work with // their real subjects directly. In this case, to implement the pattern // more easily, you can extend your proxy from the real subject's class. publicvoidClientCode(ISubject subject) { // ...
subject.Request();
// ... } }
classProgram { staticvoidMain(string[] args) { Client client = new Client();
Console.WriteLine("Client: Executing the client code with a real subject:"); RealSubject realSubject = new RealSubject(); client.ClientCode(realSubject);
Console.WriteLine();
Console.WriteLine("Client: Executing the same client code with a proxy:"); Proxy proxy = new Proxy(realSubject); client.ClientCode(proxy); } } }
执行结果:
1 2 3 4 5 6 7
Client: Executing the client code with a real subject: RealSubject: Handling Request.
Client: Executing the same client code with a proxy: Proxy: Checking access prior to firing a real request. RealSubject: Handling Request. Proxy: Logging the time of request.