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;
}
複習筆記8 位映射實現的權限管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.