假设现在有这么一个需求,要求你写一个sdk,这个sdk提供对数据库的增、删、改、查的功能。但是,给不用的公司使用时拥有的操作权限不一样。
对于没付费的用户,只能让他看到增加和查看的功能,
对于付费的用户,增、改、查的功能都能看到。
对于管理员,增、删、改、查的功能都能看到。
我的思路是这样的:首先写一个提供全部功能的DBHelper类,包含增、删、改、查的功能。但是这些功能不能对外暴露,同时又要能给我们的代理类调用。这就要用到java的作用域。下面来复习一下java作用域。
java作用域public ,private ,protected 及不写时的区别
在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。
1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
我分析了一个java的friendly访问权限(默认不带任何操作符)正好满足我们的这个需要。
有了这个原理,我们看看具体的实现
package com.example.acess;
public class InfoBean {
public String name;
public String description;
public InfoBean(String name,String description) {
this.name = name;
this.description = description;
}
}
DBHelper包最全套方法的类,使用默认的friendly关键字(可以不写)来修饰。由于java的特征,这个类只有给你jar包内部的其他类调用(同一个package),就是我们自己写的FreeDBHelper等类。而外部的三方客户调用不了这个类里的方法。这就很好的做到了隐私保护和权限设置。
package com.example.acess;
public class DBHelper {
void add(InfoBean info) {
System.out.println("添加数据"+info.name);
}
void delete(InfoBean info) {
System.out.println("删除数据"+info.name);
}
void update(InfoBean info) {
System.out.println("修改数据"+info.name);
}
void query(String name) {
System.out.println("查询数据"+name);
}
}
package com.example.acess;
/**
* 给免费用户使用的时候,给他们把这个类打包进去。用户只能接过这个类进行 add 和 query操作。
* @author tomyzhou
*
*/
public class FreeDBHelper {
private DBHelper helper;
public FreeDBHelper() {
this.helper = new DBHelper();
}
public void add(InfoBean info) {
helper.add(info);
}
public void query(String name) {
helper.query(name);
}
}
package com.example.acess;
/**
* 给付费用户使用的时候,给他们把这个类打包进去。用户能通过这个类进行 add、query、update操作。
* @author tomyzhou
*
*/
public class PayedDBHelper {
private DBHelper helper;
public PayedDBHelper() {
this.helper = new DBHelper();
}
public void add(InfoBean info) {
helper.add(info);
}
public void query(String name) {
helper.query(name);
}
public void update(InfoBean info) {
helper.update(info);
}
}
package com.example.acess;
/**
* 给管理员使用的时候,给他们把这个类打包进去。用户能通过个类进度add、query、update、delete操作。
* @author tomyzhou
*
*/
public class AdminDBHelper {
private DBHelper helper;
public AdminDBHelper() {
this.helper = new DBHelper();
}
public void add(InfoBean info) {
helper.add(info);
}
public void query(String name) {
helper.query(name);
}
public void update(InfoBean info) {
helper.update(info);
}
public void delete(InfoBean info) {
helper.delete(info);
}
}
//用户使用类,在不同的package中的代码
package com.example.user;
import com.example.acess.FreeDBHelper;
import com.example.acess.InfoBean;
import com.example.acess.PayedDBHelper;
public class Client {
public static void main(String args[]) {
FreeDBHelper helper = new FreeDBHelper();
helper.add(new InfoBean("aa","this is aa"));
helper.query("hello");
PayedDBHelper helper2 = new PayedDBHelper();
helper2.update(new InfoBean("bb","this is bb"));
}
}
上面的操作可以只写一套实际操作数据库的代码,通过代理的方式和java的可见性特征很方便的实现了权限等级分类,不同权限
的用户可以调用到不同的操作,有很多使用场景。