複習筆記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;
}

發佈了49 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章