代理模式为其他对象提供一种代理以控制对这个对象的访问,它侧重于增加间接层来简化复杂的问题。
代理模式角色:
◊Subject:定义ConcreteSubject与Proxy的共用接口,从而在任何使用ConcreteSubject的地方都可以使用Proxy。
◊ConcreteSubject:定义Proxy所代表的Subject。
◊Proxy:1、维持一个引用,使得代理可以访问Subject;2、提供一个与Subject的接口相同的接口,这样代理就可以替代Subject;3、控制对Subject的访问,并可能负责对Subject的创建和删除。
在代理模式中,由于Proxy与ConcreteSubject继承同一接口,所以Client调用ConcreteSubject可以转化为Client调用Proxy在调用ConcreteSubject,类Proxy为中间代理。
在现实生活中,房东需要出租房子,找一个房产中介公司,中介公司根据需求帮助房东寻找租客,并配合租客看房,中介公司就是代理。
结构图
namespace Libraries.Test.DesignPattern.Proxy
{
/// <summary>
/// 房屋出租
/// </summary>
public interface IHouseRentals
{
/// <summary>
/// 寻找客户
/// </summary>
string LookingCustomers();
/// <summary>
/// 带客户看房
/// </summary>
string Showings();
}
}
namespace Libraries.Test.DesignPattern.Proxy
{
/// <summary>
/// 实现类
/// </summary>
public class HouseRentals : IHouseRentals
{
public string LookingCustomers()
{
return "寻找客户";
}
public string Showings()
{
return "带客户看房";
}
}
}
namespace Libraries.Test.DesignPattern.Proxy
{
/// <summary>
/// 代理类
/// </summary>
public class HouseProxy : IHouseRentals
{
private IHouseRentals houseRentals = new HouseRentals();
/// <summary>
/// 寻找客户
/// </summary>
/// <returns></returns>
public string LookingCustomers()
{
return houseRentals.LookingCustomers();
}
/// <summary>
/// 带客户看房
/// </summary>
/// <returns></returns>
public string Showings()
{
return houseRentals.Showings();
}
}
}
namespace Libraries.Test.DesignPattern.Proxy
{
public class Client
{
public void Excute()
{
//寻找客户、带客户看房
HouseProxy proxy = new HouseProxy();
string lookCustomers = proxy.LookingCustomers();
string showimgs = proxy.Showings();
}
}
}