您的位置:首页 > 其它

复习笔记8 位映射实现的权限管理

2012-05-20 14:52 148 查看
public class Test9
{
public static void main(String[] args)
{
User user = new User();
//这里我们给了用户两个权限,一个注册,一个登陆
//01 | 10 结果是 11,这没什么好说的了,都讲过了
user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN);
System.out.println(getIntegerToBinary(user.getPermission()));
//这里修改了用户的权限,变成了登陆和退出
user.setPermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_LOGOUT);
System.out.println(getIntegerToBinary(user.getPermission()));
//而这,我们给用户增加了一个包括登陆和评论的功能,
//说是回复也行,都一样,但要注意,登陆前边咱已经
//有了吧?这地方就是为什么用 | ,当然你用 & ^
//也能行,不过你是不是得求一下补集或者差集呢? 
user.addPermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT);
System.out.println(getIntegerToBinary(user.getPermission()));
//删除这里比较有意思,其实就是求两个集合的并集
//并从用户权限集合中把这个并集干掉,就哦拉。
user.deletePermission(Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_ACCESS);
System.out.println(getIntegerToBinary(user.getPermission()));
System.out.println("======================================>");

//这里边列出了查询中会碰到的一些情况,
//也是用来测试这个功能是不是好用
System.out.println(user.contains(Permission.BBS_PERMISSION_COMMENT));
System.out.println(user.contains(Permission.BBS_PERMISSION_LOGOUT));
System.out.println(user.contains(Permission.BBS_PERMISSION_COMMENT | Permission.BBS_PERMISSION_LOGOUT));
System.out.println(user.contains(Permission.BBS_PERMISSION_ACCESS));
System.out.println(user.contains(Permission.BBS_PERMISSION_LOGOUT | Permission.BBS_PERMISSION_ACCESS));
System.out.println("======================================>");

//这个逐级审查其实有个小窍门,只要在找到这个掩码表示的权限之前
//发现1个0,那肯定就是假,至于这个应用在什么地方,方法的注释上有
user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT);
System.out.println(getIntegerToBinary(user.getPermission()));
System.out.println(user.containsBits(Permission.BBS_PERMISSION_COMMENT));
System.out.println(user.containsBits(Permission.BBS_PERMISSION_LOGIN));
System.out.println("======================================>");

user.setPermission(Permission.BBS_PERMISSION_REGISTER | Permission.BBS_PERMISSION_LOGIN | Permission.BBS_PERMISSION_COMMENT | Permission.BBS_PERMISSION_PUBLISH);
System.out.println(getIntegerToBinary(user.getPermission()));
System.out.println(user.containsBits(Permission.BBS_PERMISSION_COMMENT));
System.out.println(user.containsBits(Permission.BBS_PERMISSION_LOGIN));
System.out.println("======================================>");
}

public static final String DEFAULT_INT_ZERO = "00000000000000000000000000000000";
public static final String getIntegerToBinary(int value)
{
String binary = Integer.toBinaryString(value);
int length = Integer.SIZE - binary.length();
return DEFAULT_INT_ZERO.substring(0, length) + binary;
}
}
class User
{
private int permission = 0;

public void setPermission(int permission)
{
this.permission = permission;
}

public int getPermission()
{
return this.permission;
}

/**
* 检查用户是否具有指定的权限集合
* @param masks
* @return
*/
public boolean contains(int masks)
{
//    	return (this.permission | masks) == this.permission;
return (this.permission & masks) == masks;
}

/**
* 逐级审查
* 这个用在这里其实并不恰当,举个例子说下
* 比如说在10层楼里,很多重要地方都是有权限的吧
* 比如职员只能在1楼,经理可以去2楼,老总在顶楼之类的
* 那么也就是说我有2楼的权限是不是也能去1楼,老总的10层权限
* 哪层都可以吧?
*
* 另外一个是,这个函数的方法是不是最优的,其实还有简便写法
* 你可以自己尝试下。我现在这个写法仅是用来符合逻辑
*
* 从1楼到10检查,比如看你有没有3层的权限,是不是意味着,如果
* 你没有1楼的就直接不可能有3楼的权限,因为你连这个楼的大门都进不来吧?
* 换句话说你想到几楼去,这个楼层之前任何的一层楼你没有权限你都不能到这个楼去
*
* 虽然这个方法的局限性很大,但应用范围也很广
* @param mask
* @return
*/
public boolean containsBits(int mask)
{
//这个0其实会略微影响效率,正常开发不会写这个
//因为0基本上不会有人传进来,这个看似是提高
//效率的办法其实是错的。
if(mask == 0)
return false;
int tmp = 1;
while (true)
{
if((tmp & this.permission) == tmp)
//这个if千万不能合并到上边,否则必错
//因为这里的else的作用域也被提升了
if(tmp == mask)
return true;
else
{
//这里的两行不能写进下边的else里
tmp <<= 1;
continue;
}
else
return false;
}
}

/**
* 为用户添加权限
* @param masks 需要添加的权限集合
*/
public void addPermission(int masks)
{
//这里为什么不用检测是否有某些权限?
this.permission |= masks;
}

/**
* 为用户取消权限
* @param masks 需要取消的权限集合
*/
public void deletePermission(int masks)
{
//这里主要分析的是,用户和你要删除的权限的交集
//用户没有的没必要进行操作
this.permission ^= (this.permission & masks);
}
}
//这里的接口是用来封装掩码集的,其实这在java里很常见
//接口并不意味着必须要有功能抽象
interface Permission
{
public static final int BBS_PERMISSION_REGISTER = 1;
public static final int BBS_PERMISSION_LOGIN = 2;
public static final int BBS_PERMISSION_PUBLISH = 4;
public static final int BBS_PERMISSION_COMMENT = 8;
public static final int BBS_PERMISSION_ACCESS = 16;
public static final int BBS_PERMISSION_LOGOUT = 32;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: