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

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值