【设计模式】--代理模式 (Proxy模式)

     在软件系统中,我们无时不在跨越障碍,当我们访问网络上一台计算机的资源时,我们正在跨越网络障碍;当我们去访问服务器上数据库时,我们又在跨越数据库访问障碍,同时还有网络障碍。跨越这些障碍有时候是非常复杂的,如果我们更多的去关注处理这些障碍问题,可能就会忽视了本来应该关注的业务逻辑问题,Proxy模式有助于我们去解决这些问题。


生活中的例子:

      代理模式提供一个中介以控制对这个对象的访问。一张支票存根或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制,最终是为了实现支付这个功能。

 

1.首先,我们以一个简单的数学计算程序为例,这个程序只负责进行简单的加减乘除运算:

public class Math      //设计加减乘除四种运算类
{
	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 Dev(double x,double y)
	{
	  return x / y;
	}
}

2.如果这个计算机程序是部署在我们的本地计算机上的,那就十分简单了,我们也不需要去考虑代理模式了。但是现在如果这个Math类不在本地,而是部署在一台服务器上,也就是Math类和客户端不在同一空间,那么我们就需要跨越internet这个网络障碍:


3.那如果网络出故障呢?为了解决网络故障的复杂性和不确定性,我们需要一个本地代理MathProxy来替Math类来打点这一切,即为我们引入了一个中间层,如下图示意:


   
4.此时我们已经实现了对Math类的代理,但是还存在一个问题,大多数情况下,我们为了保持对对象操作的透明性,并强制Math类实现MathProxy类要调用的所有的方法,我们会让它们实现与同一个接口。关于强制Math类实现代理类(MathProxy类)所有方法这个问题我也不是很理解,查资料给出最多的解释是它本身就是针对相同的接口编程(两者有相同的方法),以达到透明地替换原来的对象,而不用修改代码。


5.于是我们在Math类和MathProxy类的基础上加上一层抽象,让他们都实现IMath接口。

public interface IMath				
{
        double Add(double x,double y);
        double Sub(double x,double y);
        double Mul(double x,double y);
        double Dev(double x,double y);
}
        
        // Math类和MathProxy类分别实现IMath接口:
        public class MathProxy : Imath   //代理类
        {
        //
        }
        public class Math : Imath     //实现类
        {
        //
        }
	// 此时我们在客户程序中就可以像使用Math类一样来使用MathProxy类了:
	public class App
	{
	        public static void Main()
	        {
	                      MathProxy proxy = new MathProxy();
	                double addresult = proxy.Add(2,3);
	                double subresult = proxy.Sub(2,3);
	                double mulresult = proxy.Mul(2,3);
	                double devresult = proxy.Dev(2,3);
	        }
	}


       学习完代理模式其实我想到的第一个东西是代理服务器,原理上有很多相似的地方,什么是代理服务器呢?举个通俗的例子,比如你家的门坏了,不能走出屋子,你只能借助你家后门并且通过邻居家的门走出屋子。完成这样一个目的,就等于说是借助其他通道到达你想要到达的目的地。
       代理服务器也一样,比如本地网络无法直接访问一些网站或者服务器,必须通过一个代理点服务器,那个服务器和你的本地网络是可以直接ping的通的,然后你就必须设置这个代理服务器的一些参数,比如ip,端口,然后通过这个平台连接到其他网络区域。

总结:
     在软件系统中,增加一个中间层是我们解决问题的常见手法,这方面Proxy模式给了我们很好的实现。


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页