设计模式之代理模式
定义:
一些情况下,客户不想或不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容或服务,或者添加客户需要的额外服务。
组成:
抽象主题角色:声明了抽象主题和代理主题的公共接口
代理主题角色:内部包含对真是主题的引用,并提供和真实主题角色相同的接口
真实主题角色:定义真实的对象
以论坛中已注册用户和游客的权限不同来作为第一个例子:已注册的用户拥有发帖,修
改自己的注册信息,修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。 为了简化代码,更好的显示出代理模式的骨架,我们这里只实现发帖权限的控制。
首先我们先实现一个抽象主题角色 MyForum,里面定义了真实主题和代理主题的共同 接口——发帖功能。
代码如下:
public interface MyForum {
public void AddFile(); }
这样,真实主题角色和代理主题角色都要实现这个接口。其中真实的主题角色基本就是 将这个接口的方法内容填充进来。所以在这里就不再赘述它的实现。我们把主要的精力放到 关键的代理主题角色上。代理主题角色代码大体如下:
public class MyForumProxy implements MyForum {
private RealMyForum forum = new RealMyForum() ; private int permission ; //权限值
public MyForumProxy(int permission)
{
this.permission = permission ; }
//实现的接口
public void AddFile()
{
//满足权限设置的时候才能够执行操作
//Constants 是一个常量类 if(Constants.ASSOCIATOR == permission) {
forum.AddFile(); }
else
System.out.println("You are not a associator of MyForum ,please
registe!"); }
}