外观模式
今天,做完了公司的课题,无聊之余总结下之前的【外观模式】,看了这个模式的具体内容,很早以前就有用这样的思想了,只是不知道它叫外观模式。外观模式:实际上是提供一个经常使用的接口,这个接口他执行了许多子系统中的许多操作,使得用户不需要了解子系统中的具体操作,只需使用接口。这种例子是很常见的。
例如:我们知道用户、角色、权限三者关系,在早期,还没有角色的概念,只有用户和权限的概念,是直接讲权限赋予用户,但是后来为了方便管理,才引入角色的概念,把权限赋予角色,再把角色赋予用户。而角色就是我们外观模式中说的经常使用的接口,权限就是子系统,用户就是客户。
看下面的两个等价图:
1.有角色参与:
2.无角色参与:
可以看到,使用外观模式使的客户使用更方便,不需要了解子系统的过程,整个层次也更清晰。
无聊的实现了下这个代码:贴个纪念~~
1.权限类
/** * 权限类 * * @author ChenST * * @create 2010-3-24 */ public class Right { /** 【添加】的权限 */ public final static String ADD_RIGHT="【添加】"; /** 【删除】的权限 */ public final static String DELETE_RIGHT="【删除】"; /** 【更新】的权限 */ public final static String UPDATE_RIGHT="【更新】"; /** 【查看】的权限 */ public final static String SEE_RIGHT="【查看】"; }
2.角色抽象类
/** * 角色抽象类 * * @author ChenST * * @create 2010-3-24 */ public abstract class Role { /** 角色拥有的权限*/ private Set<String> rights; public Role(){ this.rights=new HashSet<String>(); //赋权操作 this.addRight(); } /** * 添加权限 */ public abstract void addRight(); public Set<String> getRights() { return rights; } }
3.管理员角色
/** * 超级管理员角色 * * @author ChenST * * @create 2010-3-24 */ public class Admin extends Role{ /* * 添加全部的权限 * (non-Javadoc) * @see facade.Role#addRight() */ @Override public void addRight() { this.getRights().add(Right.ADD_RIGHT); this.getRights().add(Right.DELETE_RIGHT); this.getRights().add(Right.SEE_RIGHT); this.getRights().add(Right.UPDATE_RIGHT); } }
4.会员用户
/** * 会员用户 * * @author ChenST * * @create 2010-3-24 */ public class Vip extends Role { /* * 会员用户拥有【添加】权限 * (non-Javadoc) * @see facade.Role#addRight() */ @Override public void addRight() { this.getRights().add(Right.ADD_RIGHT); } }
5.普通用户角色
/** * 普通用户角色 * * @author ChenST * * @create 2010-3-24 */ public class CommonUser extends Role{ /* * 普通用户只拥有【查看】的权限 * (non-Javadoc) * @see facade.Role#addRight() */ @Override public void addRight() { this.getRights().add(Right.SEE_RIGHT); } }
5.用户类
/** * 用户 * * @author ChenST * * @create 2010-3-24 */ public class User { /** 用户姓名 */ private String name; /** 用户所拥有的角色 */ private Set<Role> roles; public User(String name){ this.name=name; roles=new HashSet<Role>(); } /** * 添加权限 * @param role */ public void addRole(Role role){ this.roles.add(role); } /** * 查看用户所拥有的权限 */ public void lookRight(){ System.out.println(this.name+"权限有:"+this.getRights()); } /** * 获取用户所拥有的权限 * @return */ public Set<String> getRights() { Set<String> rights=new HashSet<String>(); for (Role role : roles) { for (String right: role.getRights()) { rights.add(right); } } return rights; } }
6.测试类
/** * 测试类 * * @author ChenST * * @create 2010-3-24 */ public class Test { public static void main(String[] args) { //创建用户james和green User james=new User("james"); User green=new User("green"); User joe=new User("joe"); //创建三个角色 超级管理员,普通管理员,普通用户 Role admin=new Admin(); Role vip=new Vip(); Role commonUser=new CommonUser(); //给james赋予角色,赋予管理员和普通用户 james.addRole(admin); james.addRole(commonUser); //给green赋予角色,赋予管理员 green.addRole(admin); //给joe赋予角色,赋予管理员和会员 joe.addRole(vip); joe.addRole(admin); //查看拥有的权限 james.lookRight(); green.lookRight(); joe.lookRight(); } }
运行结果:
james权限有:[【删除】, 【更新】, 【查看】, 【添加】] green权限有:[【删除】, 【更新】, 【查看】, 【添加】] joe权限有:[【删除】, 【更新】, 【查看】, 【添加】]
可以看到,对于角色很好扩展和维护,对于权限的分配也可以很好维护,例如,会员用户要添加一个新的权限,那么则只要修改会员用户的权限,而不需要把相关的用户全部修改。OK~~