设计模式之Proxy(代理)

总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的 Java 内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系.

 

如何使用Proxy?

以Jive论坛系统为例,访问论坛系统的用户有多种类型:注册普通用户 论坛 管理 者 系统管理者 游客,注册普通用户才能发言;论坛管理者可以管理他被授权的论坛;系统管理者可以管理所有事务等,这些权限划分和管理是使用Proxy完成的.

 

Forum是Jive的核心接口,在Forum中陈列了有关论坛操作的主要行为,如论坛名称 论坛描述的获取和修改,帖子发表删除编辑等.

 

在ForumPermissions中定义了各种级别权限的用户:

 

public class ForumPermissions implements Cacheable {

/**

* Permission to read object.

*/

public static final int READ = 0;

 

/**

* Permission to administer the entire sytem.

*/

public static final int SYSTEM_ADMIN = 1;

 

/**

* Permission to administer a particular forum.

*/

public static final int FORUM_ADMIN = 2;

 

/**

* Permission to administer a particular user.

*/

public static final int USER_ADMIN = 3;

 

/**

* Permission to administer a particular group.

*/

public static final int GROUP_ADMIN = 4;

 

/**

* Permission to moderate threads.

*/

public static final int MODERATE_THREADS = 5;

 

/**

* Permission to create a new thread.

*/

public static final int CREATE_THREAD = 6;

 

/**

* Permission to create a new message.

*/

public static final int CREATE_MESSAGE = 7;

 

/**

* Permission to moderate messages.

*/

public static final int MODERATE_MESSAGES = 8;

 

.....

 

public boolean isSystemOrForumAdmin() {

  return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);

}

 

.....

 

}

 

 

因此,Forum中各种操作权限是和ForumPermissions定义的用户级别有关系的,作为接口Forum的实现:ForumProxy正是将这种对应关系联系起来.比如,修改Forum的名称,只有论坛 管理 者或系统管理者可以修改,代码如下:

 

public class ForumProxy implements Forum {

 

private ForumPermissions permissions;

private Forum forum;

this.authorization = authorization;

 

public ForumProxy(Forum forum, Authorization authorization,

ForumPermissions permissions)

{

this.forum = forum;

this.authorization = authorization;

this.permissions = permissions;

}

 

.....

public void setName(String name) throws UnauthorizedException,

ForumAlreadyExistsException

{

  //只有是系统或论坛 管理 者才可以修改名称

  if (permissions.isSystemOrForumAdmin()) {

    forum.setName(name);

  }

  else {

    throw new UnauthorizedException();

  }

}

 

...

 

}

 

 

 

而DbForum才是接口Forum的真正实现,以修改论坛名称为例:

 

public class DbForum implements Forum, Cacheable {

...

 

public void setName(String name) throws ForumAlreadyExistsException {

 

  ....

 

  this.name = name;

  //这里真正将新名称保存到数据库中

  saveToDb();

 

  ....

}

 

 

 

...

 

}

 

 

凡是涉及到对论坛名称修改这一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy决定是否有权限做某一样事情,ForumProxy是个名副其实的"网关"," 安全 代理系统".

 

在平时应用中,无可避免总要涉及到系统的授权或安全体系,不管你有无意识的使用Proxy,实际你已经在使用Proxy了.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值