代理模式的工作原理
3. 代理主题角色PriceProxy:
4.辅助代码XML文件 App.config:
5.客户端测试类Client:
运行结果:
可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身。即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。。
代理模式的 UML 类图如下:
代理模式包含如下角色:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
应用实例:
用代理模式设计房屋租赁中介的模拟程序
模拟如下要求:租房者和出租者都通过房屋中介来互相选择,将他们的要求简化为每间房多少钱。
类图:
源代码:
1. 抽象主题角色AbstractPrice:
namespace PriceSample
{
interface AbstractPrice
{
void SalePrice();
void BuyPrice();
void setLevel(int level);
}
}
2. 真实主题角色RealPrice:
namespace PriceSample
{
class RealPrice : AbstractPrice
{
public void SalePrice()
{
Console.WriteLine("这间房出租者卖***万元");
}
public void BuyPrice()
{
Console.WriteLine("租房者想买一间房间为****左右的房");
}
public void setLevel(int level)
{
}
}
}
3. 代理主题角色PriceProxy:
namespace PriceSample
{
class PriceProxy : AbstractPrice
{
private RealPrice price = new RealPrice(); //维持一个对真实主题的引用
private int level;
public void setLevel(int level)
{
this.level = level;//0是租房者,1是出租者,
}
public void SalePrice()
{
if (0 == level)
{
Console.WriteLine("对不起,您无法选择买房屋");
}
else if (1 == level)
{
price.SalePrice();
}
}
public void BuyPrice()
{
if (1 == level)
{
Console.WriteLine("对不起,您无法选择卖房屋");
}
else if (0 == level)
{
price.BuyPrice();
}
}
}
}
4.辅助代码XML文件 App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="proxy" value="PriceSample.PriceProxy"/>
</appSettings>
</configuration>
5.客户端测试类Client:
namespace PriceSample
{
class Client
{
static void Main(string[] args)
{
//针对抽象目标接口编程
AbstractPrice price;
//读取配置文件
string proxy = ConfigurationManager.AppSettings["proxy"];
//反射生成对象
price = (AbstractPrice)Assembly.Load("PriceSample").CreateInstance(proxy);
price.setLevel(0);//0是租房者,1是出租者
price.SalePrice();
price.BuyPrice();
Console.Read();
}
}
}
运行结果: