Proxy模式
来源:互联网 发布:天罡掌诀推算法 编辑:程序博客网 时间:2024/05/01 15:33
目录
- 定义
- UML
- 参与者
- 示例
定义:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
UML:
参与者:
抽象主题(Subject)角色:
声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替.
具体主题(RealSubject)角色:
实现抽象主题角色的具体对象。
代理主题(Proxy)角色:
含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.
示例:
using System; namespace DoFactory.GangOfFour.Proxy.Structural{ /// <summary> /// MainApp startup class for Structural /// Proxy Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main() { // Create proxy and request a service Proxy proxy = new Proxy(); proxy.Request(); // Wait for user Console.ReadKey(); } } /// <summary> /// The 'Subject' abstract class /// </summary> abstract class Subject { public abstract void Request(); } /// <summary> /// The 'RealSubject' class /// </summary> class RealSubject : Subject { public override void Request() { Console.WriteLine("Called RealSubject.Request()"); } } /// <summary> /// The 'Proxy' class /// </summary> class Proxy : Subject { private RealSubject _realSubject; public override void Request() { // Use 'lazy initialization' if (_realSubject == null) { _realSubject = new RealSubject(); } _realSubject.Request(); } }}
Output
Called RealSubject.Request()
实际运用:
using System; namespace DoFactory.GangOfFour.Proxy.RealWorld{ /// <summary> /// MainApp startup class for Real-World /// Proxy Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main() { // Create math proxy MathProxy proxy = new MathProxy(); // Do the math Console.WriteLine("4 + 2 = " + proxy.Add(4, 2)); Console.WriteLine("4 - 2 = " + proxy.Sub(4, 2)); Console.WriteLine("4 * 2 = " + proxy.Mul(4, 2)); Console.WriteLine("4 / 2 = " + proxy.Div(4, 2)); // Wait for user Console.ReadKey(); } } /// <summary> /// The 'Subject interface /// </summary> public interface IMath { double Add(double x, double y); double Sub(double x, double y); double Mul(double x, double y); double Div(double x, double y); } /// <summary> /// The 'RealSubject' class /// </summary> class Math : IMath { public double Add(double x, double y) { return x + y; } public double Sub(double x, double y) { return x - y; } public double Mul(double x, double y) { return x * y; } public double Div(double x, double y) { return x / y; } } /// <summary> /// The 'Proxy Object' class /// </summary> class MathProxy : IMath { private Math _math = new Math(); public double Add(double x, double y) { return _math.Add(x, y); } public double Sub(double x, double y) { return _math.Sub(x, y); } public double Mul(double x, double y) { return _math.Mul(x, y); } public double Div(double x, double y) { return _math.Div(x, y); } }}
Output
4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2
- Proxy 模式
- proxy模式
- Proxy模式
- Proxy模式
- Proxy模式
- Proxy模式
- Proxy模式
- Proxy 模式
- Proxy模式
- Proxy模式
- proxy 模式
- Proxy模式
- Proxy模式
- Proxy模式
- Proxy 模式
- proxy模式
- Proxy模式
- Proxy 模式
- 私有继承中的派生类对象与基类对象间的转换
- Maven3实战笔记02坐标和依赖--1
- linux驱动头文件说明(转载)
- javascript中几种页面跳转方式
- 关于hibernate(jpa)报not-null property references a null or transient value的问题
- Proxy模式
- 颠倒栈
- 好久没来csdn啦
- 自定义ios UIAlertView, 重排按钮位置
- 由抢购小米手机联想到的一些问题
- MFC 的默认按键
- 监听WebView滑动到底端
- PHPExcel:用于Excel等文档生成的PHP开源类库
- java的Calendar时间类