美文网首页android源码中不同设计模式的使用总结
设计模式之外观模式(门面模式) - Facade

设计模式之外观模式(门面模式) - Facade

作者: ahking17 | 来源:发表于2017-02-28 11:11 被阅读41次
    外观模式的用处

    对于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.---

    相关文章

      网友评论

        本文标题:设计模式之外观模式(门面模式) - Facade

        本文链接:https://www.haomeiwen.com/subject/ookxgttx.html