大B:“下面以论坛中已注册用户和游客的权限不同来作为第一个例子,我再给你详细说一下。”
大B:“已注册的用户拥有发帖,修改自己的注册信息,修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。为了简化代码,更好的显示出代理模式的骨架,我们这里只实现发帖权限的控制。首先我们先实现一个抽象主题角色MyForum,里面定义了真实主题和代理主题的共同接口——发帖功能。”
代码如下:
publicinterfaceMyForum
{
publicvoidAddFile();
}
大B:“这样,真实主题角色和代理主题角色都要实现这个接口。其中真实的主题角色基本就是将这个接口的方法内容填充进来。所以在这里就不再说它的实现。我们把主要的精力放到关键的代理主题角色上。”
代理主题角色代码大体如下:
publicclassMyForumProxyimplementsMyForum
{
privateRealMyForumforum;
privateintpermission;//权限值
publicMyForumProxy(intpermission)
{
forum=newRealMyForum()
this.permission=permission;
}
//实现的接口
publicvoidAddFile()
{//满足权限设置的时候才能够执行操作
//Constants是一个常量类
if(Constants.ASSOCIATOR……permission)
{
forum.AddFile();
}
else
System.out.println(“YouarenotaassociatorofMyForum,pleaseregiste!”);
}
}
大B:“这样就实现了代理模式的功能。当然你也可以在这个代理类上添加自己的方法来实现额外的服务,比如统计帖子的浏览次数,记录用户的登录情况等等。还有一个很常见的代理模式的使用例子就是对大幅图片浏览的控制。”
小A:“当我们在网站上面浏览图文的信息时,图片位置放置的是经过缩小的,当有人要详细的查看这个图片时,可以通过点击图片来激活一个链接,在一个新的网页打开要看的图片。”
大B:“嗯。对。这样对于提高浏览速度是很有好处的,因为不是每个人都要去看详细图上的信息。”
小A:“是吗?”
大B:“这种情况就可以使用代理模式来全面实现。这里我将思路表述出来,至于实现就不表述了,至于这种方式在B/S模式下的真实可行性,只是凭空的想象。如果不是可行的方式,那这个例子可以放到一个C/S下来实现,这个是绝对没有问题的。我们在浏览器中访问网页时是调用的不是真实的装载图片的方法,而是在代理对象中的方法,在这个对象中,先使用一个线程向浏览器装载了一个缩小版的图片,而在后台使用另一个线程来调用真实的装载大图片的方法将图片加载到本地,当要浏览这个图片的时候,将其在新的网页中显示出来。当然如果在想浏览的时候图片尚未加载成功,可以再启动一个线程来显示提示信息,直到加载成功。这样代理模式的功能就在上面体现的淋漓尽致——通过代理来将真实图片的加载放到后台来操作,使其不影响前台的浏览。代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。不过一定要记住前面讲的使用代理模式的条件,不然的话使用了代理模式不但不会有好的效果,说不定还会出问题的。”