本学期十五周快完了,大物考试,一步步逼近,临时抱佛脚中啊。上半学期的计算机科学基础考的太差,不过也对这种双语课程的开课模式不太认同,学校课程开设上连续性不大,让学生普遍迷茫,也更让我认识到学习技术还真得靠自学啊~诶,不扯多了,今天要学习的是代理模式,周末准备暂停学习新模式,复习学习的四个模式,每个模式再实践一下,毕竟写代码的能力还是太差
代理模式(Proxy Pattern)
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式由三个角色组成:
1.虚拟角色类:通过接口或虚拟类声明真实角色中的业务方法
2.代理角色类:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
3.真实角色类:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
类图:
现实生活中,代购、通过代理去上脸书、推特,通过经销商买东西都可以看作是代理模式。而代理模式的应用非常多,比如下面这些:
(1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为大使(Ambassador)。
(2) 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
(3) 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
(4) 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
(5) 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。
(以上其实不是好理解.......)
这里需要使用的是以上应用中的保护代理。代理类可以对用户访问权限进行控制,因此有些用户无法调动真实业务类的某些方法,当用户权限改变之后,则可以访问这些方法。
实现代码:
AbstractPermission.cs
abstract class AbstractPermission
{
public abstract void modifyUserInfo();
public abstract void viewNote();
public abstract void publishiNote();
public abstract void modifyNote();
public abstract void setLevel(int level);
}
RealPermission.cs
class RealPermission : AbstractPermission
{
public override void modifyUserInfo()
{
Console.WriteLine("修改个人信息");
}
public override void viewNote()
{
}
public override void modifyNote()
{
Console.WriteLine("修改发贴内容!");
}
public override void publishiNote()
{
Console.WriteLine("发布新贴!");
}
public override void setLevel(int level)
{
}
}
PermissionProxy.cs
class PermissionProxy : AbstractPermission
{
private RealPermission permission = new RealPermission();
private int level = 0;
public override void modifyUserInfo()
{
if (level == 0)
{
Console.WriteLine("对不起,你没有权限修改个人信息!");
}
else if (level == 1)
{
permission.modifyUserInfo();
}
}
public override void viewNote()
{
Console.WriteLine("查看帖子!");
}
public override void publishiNote()
{
if (level == 0)
{
Console.WriteLine("对不起,你没有权限发布新贴!");
}
else if (level == 1)
{
permission.publishiNote();
}
}
public override void modifyNote()
{
if (level == 0)
{
Console.WriteLine("对不起,你没有权限修改帖子内容!");
}
else if (level == 1)
{
permission.modifyNote();
}
}
public override void setLevel(int level)
{
this.level = level;
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
PermissionProxy proxy = new PermissionProxy();
proxy.viewNote();
proxy.publishiNote();
proxy.modifyNote();
proxy.modifyUserInfo();
Console.WriteLine("-----------------------------------------");
proxy.setLevel(1);
proxy.viewNote();
proxy.publishiNote();
proxy.modifyNote();
proxy.modifyUserInfo();
Console.ReadKey();
}
}
代理模式在一定程度上降低了系统的耦合度, 但由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。