一、应用场景
替隔壁班的老万同学追自己班的女同学
二、代理设计模式定义
为其他对象提供一种代理,以控制对这个对象的访问。
public interface ISubject
{
void GiveSmoking();
void GiveBea();
void GiveJK();
}
public class ClassFlower
{
public string Name { set; get; }
}
public class ReadSubject:ISubject
{
public ClassFlower ClassFlower;
public ReadSubject(ClassFlower classFlower)
{
this.ClassFlower = classFlower;
}
public void GiveBea()
{
Console.WriteLine(this.ClassFlower.Name+"同学,请你喝酒!");
}
public void GiveJK()
{
Console.WriteLine(this.ClassFlower.Name + "同学,请你穿JK!");
}
public void GiveSmoking()
{
Console.WriteLine(this.ClassFlower.Name + "同学,请你抽烟!");
}
}
public class Proxy : ISubject
{
private ReadSubject readSubject;
public Proxy(ReadSubject readSubject)
{
this.readSubject = readSubject;
}
public void GiveBea()
{
this.readSubject.GiveBea();
}
public void GiveJK()
{
this.readSubject.GiveJK();
}
public void GiveSmoking()
{
this.readSubject.GiveSmoking();
}
}
ClassFlower classFlower = new ClassFlower();
classFlower.Name = "韩梅梅";
ISubject subject = new Proxy(new ReadSubject(classFlower));
subject.GiveSmoking();
subject.GiveBea();
subject.GiveJK();
三、代理的分类
举例:有一个订单系统,要求是:一旦订单被创建,只有订单的创建人能修改订单中的数据,其他人不能修改;
相当于有一个订单对象,要控制外部对这个订单对象的访问权限,满足条件的可以访问,不满足的不能访问。
订单:订单产品名称、订单产品数量、订单创建用户。
为一个对象在不同的地址空间,提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实;
客户端调用web服务,会生成WebReference文件和文件夹,WebReference就是代理,使得客户端可以实现远程访问功能。
如果要创建开销很大的对象,可以通过代理来存放实例化需要很长时间的真实对象。
打开一个很大的网页,除了文字先出现外,图片和视频都是慢慢出现的。
查询某个部门下所有的员工信息,性别,姓名,年龄,毕业院校,部门,照片
安全代理设计模式的代码:
//封装了实体对象和代理对象的公共接口
public interface IOrder
{
//获取订单的产品名称
string GetProductName();
//设置订单中产品名称
void SetProductName(string productName, string user);
//获取订单中产品数量
int GetOrderNumber();
//设置订单中产品数量
void SetOrderNumber(int count, string user);
//获取创建订单的用户
string GetOrderUser();
//设置创建订单的用户
void SetOrderUser(string orderUserName, string user);
}
//真正的订单类
public class RealOrder : IOrder
{
//订单产品名称
public string ProductName { get; set; }
//订单产品数量
public int ProductCount { get; set; }
//订单创建用户
public string OrderUser { get; set; }
public RealOrder(string productName,int productCount,string orderUSer)
{
this.ProductName = productName;
this.ProductCount = productCount;
this.OrderUser = orderUSer;
}
public int GetOrderNumber()
{
return this.ProductCount;
}
public string GetOrderUser()
{
return this.OrderUser;
}
public string GetProductName()
{
return this.ProductName ;
}
public void SetOrderNumber(int count, string user)
{
this.ProductCount = count ;
}
public void SetOrderUser(string orderUserName, string user)
{
this.OrderUser = orderUserName;
}
public void SetProductName(string productName, string user)
{
this.ProductName = productName ;
}
}
//订单的代理
public class ProxyOreder : IOrder
{
//封装一个实体对象的引用
private RealOrder realOrder;
public ProxyOreder(RealOrder realOrder)
{
this.realOrder = realOrder;
}
public int GetOrderNumber()
{
return this.realOrder.GetOrderNumber();
}
public string GetOrderUser()
{
return this.realOrder.GetOrderUser();
}
public string GetProductName()
{
return this.realOrder.GetProductName();
}
public void SetOrderNumber(int count, string user)
{
//对权限进行判断,有权限可以访问,没权限不能访问
if (user!=null&&user.Equals(this.realOrder.OrderUser))
{
this.realOrder.SetOrderNumber(count, user);
}
else
{
Console.WriteLine("你无权修改订单数据");
}
}
public void SetOrderUser(string orderUserName, string user)
{
//对权限进行判断,有权限可以访问,没权限不能访问
if (user != null && user.Equals(this.realOrder.OrderUser))
{
this.realOrder.SetOrderUser(orderUserName, user);
}
else
{
Console.WriteLine("你无权修改订单数据");
}
}
public void SetProductName(string productName, string user)
{
//对权限进行判断,有权限可以访问,没权限不能访问
if (user != null && user.Equals(this.realOrder.OrderUser))
{
this.realOrder.SetProductName(productName, user);
}
else
{
Console.WriteLine("你无权修改订单数据");
}
}
}
IOrder order = new ProxyOreder(new RealOrder("笔记本电脑", 100, "张三"));
order.SetOrderNumber(1000, "张三");
Console.WriteLine(order.GetOrderNumber());
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。