设计模式之Proxy(代理)

    技术2022-05-11  82

    总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的 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了.


    最新回复(0)