定义
为其他对象提供一种代理以控制这个对象的访问
使用场景
- 将项目中第三方库使用代理模式引入,减少对项目的入侵
示例
ISubject
- 抽象主题,基本规则源于这里。无论是代理类还是实现主题,都基于抽象主题,在制作抽象主题时要尽量多的考虑。
- 在代理系统中充当一个老板的角色。自己的意志贯穿整个系统。
/**
* 抽象主题
* <p>
* 抽象主题含有真实主题、代理方法的共同接口。
* 同时也是整个代理规则的划分
* </p>
*/
public interface ISaveDataSubject {
/**
* 保存字符串类型数据
*
* @param key key
* @param value value
*/
void saveString(String key, String value);
/**
* 查找字符串类型数据
*
* @param key key
* @param defValue 默认值
*/
String findString(String key, String defValue);
}
RealSubject
- 真实主题,具体实现抽象主题中的方法。
- 在代理系统中充当一个工人的状态,去落实领导的指令。
/**
* 真实主题
* <p>
* 具体实现抽象主题中的功能
* </p>
*/
public class SaveDataRealSubjectSP implements ISaveDataSubject {
private SharedPreferences mSharedPreferences;
public SaveDataRealSubjectSP(Context context) {
mSharedPreferences = context.getSharedPreferences("BaseUserData", Context.MODE_PRIVATE);
}
@Override
public void saveString(String key, String value) {
if (mSharedPreferences != null && !TextUtils.isEmpty(key)) {
mSharedPreferences.edit().putString(key, value).apply();
}
}
@Override
public String findString(String key, String defValue) {
if (mSharedPreferences != null && !TextUtils.isEmpty(key)) {
return mSharedPreferences.getString(key, defValue);
}
return defValue;
}
}
Proxy
- 代理类,持有真实主题的引用。
- 在代理模式中充当一个领导的角色,根具老板的意志,寻找合理的工人去完成任务。
/**
* 代理类
* <p>
* 1.持有真是主题的引用,充当一个第三方平台的角色
* 2.不实现具体功能,所有的实现交给了RealSubject
* </p>
*/
public class SaveDataProxy implements ISaveDataSubject {
private static SaveDataProxy mSaveDataProxy;
private ISaveDataSubject mISaveDataSubject;
private SaveDataProxy() {
}
public static SaveDataProxy getInstance() {
if (mSaveDataProxy == null) {
mSaveDataProxy = new SaveDataProxy();
}
return mSaveDataProxy;
}
public void initSaveDataProxy(ISaveDataSubject iSaveDataSubject) {
mISaveDataSubject = iSaveDataSubject;
}
@Override
public void saveString(String key, String value) {
if (mISaveDataSubject != null) {
mISaveDataSubject.saveString(key, value);
}
}
@Override
public String findString(String key, String defValue) {
if (mISaveDataSubject != null) {
return mISaveDataSubject.findString(key, defValue);
}
return defValue;
}
}
使用
- 设置代理(领导找到了可以满足老板需求的工人)
在合适的地方设置代理
public class MApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SaveDataProxy.getInstance().initSaveDataProxy(new SaveDataRealSubjectSP(this));
}
}
- 使用代理
可以看到,在项目使用中只和代理类产生了直接联系,和真实主题并没有直接关系(完美合作)。
SaveDataProxy.getInstance().saveString("textKey", "测试数据");
SaveDataProxy.getInstance().findString("textKey", "默认数据");