外观模式的用处
对于SDK和开源库来说, 外观模式是使用率最高的模式, 这些库通过外观模式为用户提供一个高层的类, 用户使用这些库只需要和这个高层的类打交道就可以了, 不必了解这些库里面各个子系统的实现细节, 降低用户的使用成本.
比如使用友盟统计SDK时, 用户通过MobclickAgent就可以完成SDK提供的所有功能. 这个MobclickAgent就是外观类.
Android源码中的使用
ContextImpl就是一个外观类, 它封装了很多重要的操作, 如 startActivity(), sendBroadcast(), bindService(), getPackageName() 等.
对开发者来说, 这是一个最重要的外观类, 封装了和其他子系统的交互.
startActivity的真正实现是通过ActivityManagerService完成的.
getPackageName的实现是通过PackageManagerService完成的.
public class ContextImpl extends ContextWrapper {
@Override
public void startActivities(Intent[] intents) {
warnIfCallingFromSystemProcess();
startActivities(intents, null);
}
@Override
public void startActivities(Intent[] intents, Bundle options) {
mMainThread.getInstrumentation().execStartActivities(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity) null, intents, options);
}
@Override
public boolean bindService(Intent service, ServiceConnection conn,
int flags) {
warnIfCallingFromSystemProcess();
return bindServiceCommon(service, conn, flags, Process.myUserHandle());
}
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
UserHandle user) {
int res = ActivityManagerNative.getDefault().bindService(
mMainThread.getApplicationThread(), getActivityToken(), service,
service.resolveTypeIfNeeded(getContentResolver()),
sd, flags, getOpPackageName(), user.getIdentifier());
return res;
}
@Override
public void sendBroadcast(Intent intent) {
ActivityManagerNative.getDefault().broadcastIntent(
mMainThread.getApplicationThread(), intent, resolvedType, null,
Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, false,
getUserId());
}
@Override
public String getPackageName() {
if (mPackageInfo != null) {
return mPackageInfo.getPackageName();
}
}
}
项目中的使用
class RealSystemFacade {
private Context mContext;
@Override
public long currentTimeMillis() {
return System.currentTimeMillis();
}
@Override
public boolean isNetworkRoaming() {
ConnectivityManager connectivity =
(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
Log.w(Constants.TAG, "couldn't get connectivity manager");
return false;
}
NetworkInfo info = connectivity.getActiveNetworkInfo();
boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
boolean isRoaming = isMobile && TelephonyManager.getDefault().isNetworkRoaming();
if (Constants.LOGVV && isRoaming) {
Log.v(Constants.TAG, "network is roaming");
}
return isRoaming;
}
@Override
public void postNotification(long id, Notification notification) {
DownloadNotificationManager.getInstance().notify(mContext, (int)id, notification);
}
}
RealSystemFacade类封装了, “获取当前时间”, “判断网络状态”, “发notification”, 这三个子系统的操作.
给用户提供了一个使用system各个子系统的统一的类.
总结:
使用外观模式避免了用户同多个子系统的交互, 降低了用户的使用成本, 对外也屏蔽了实现细节. 保证了系统的易用性和稳定性.
---DONE.---
网友评论