假设现在有这么一个需求,要求你写一个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访问权限(默认不带任何操作符)正好满足我们的这个需要。

有了这个原理,我们看看具体的实现

java编写工具Sdk设计 java sdk设计_作用域

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的可见性特征很方便的实现了权限等级分类,不同权限

的用户可以调用到不同的操作,有很多使用场景。