`
daibalusu
  • 浏览: 344520 次
文章分类
社区版块
存档分类
最新评论

简单介绍一下 设计模式在android中运用

 
阅读更多

1.观察者模式:

观察者模式在Android中有着广泛的应用,尤其是在Listener中应用广泛。本文以Button为例来介绍一下观察者模式。

首先回顾一下观察者模式。

观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。其结构如下:

可以看出观察者向Subject注册Attach和注销Detach,当Subject状态发生变化时,调用观察者的方法update,要求观察者更新状态。

在Android系统中,Activity是通过ContentResolver来和ContentProvider来交互的。我们可以向ContentResolver注册一个observer来监听数据的更新,调用ContentResolver的方法registerContentObserver()即可完成注册。这样当对应的ContentProvider数据更新的时候,我们向ContentResolver注册的对象方法将会被调用。这也是Android系统中的一个Observer模式应用实例。

当然在Android系统中Observer应用的地方还是很多的,学习Android系统的时候请注意留意。

2.单例模式:

单例模式使用比较常见,用来保证一个类仅有一个实例,并提供一个访问它的全局访问点。在Android application包中有个Bluetooth相关的包就用到了单例模式,实例代码如下:


public class BluetoothOppManager {

private static BluetoothOppManager INSTANCE;

/** Used when obtaining a reference to the singleton instance. */
private static Object INSTANCE_LOCK = new Object();

/**
* Get singleton instance.
*/
public static BluetoothOppManager getInstance(Context context) {
synchronized (INSTANCE_LOCK) {
if (INSTANCE == null) {
INSTANCE = new BluetoothOppManager();
}
INSTANCE.init(context);

return INSTANCE;
}
}

}

这里考虑到了多线程互斥的问题,引入了一个静态只读的进程辅助对象。它使得最先进入的那个线程来创建这个实例,以后的线程进入时不会创建实例对象。

不知道细心的读者发现没,这个getInstance()操作,每次被调用时,都会加上同步锁,这样会影响性能,所以有些改进的办法,见下文:

public static BluetoothOppManager getInstance(Context context) {

if(INSTANCE == null)
synchronized (INSTANCE_LOCK) {
if (INSTANCE == null) {
INSTANCE = new BluetoothOppManager();
}
INSTANCE.init(context);

}

return INSTANCE;
}
}

这种做法只有在实例未被创建的时候才加锁,同时也能保证多线程的安全,所以该做法又叫Double-Check Locking(双重锁定)。这时又有同学要问,为什么我前面已经判断了INSTANCE是否为null,为什么同步代码里面又做了一次判断?这个也不难理解,当INSTANCE为null时,两个线程同时调用,这时它们都可以通过第一轮判断,都会立马加锁,但是最先进入临界区的线程先加锁,后进入的等待之。知道先进去的哥们创建好之后出来释放为止。此时,INSTANCE已经被创建,所以后进去的哥们被唤醒时,一看INSTANCE已经被创建了,所以在这里就不需要再创建了.

好的,以上只是本人在做Android项目时,用到的设计模式,自己的一些体会,与大家一起分享,交流,共同进步.......

分享到:
评论

相关推荐

    Android代码-android_design_patterns_analysis

    但设计模式运用在Android上的书籍并不多,Android本身又是开源,那么剖析Android源码中的设计模式必定是我们学习设计模式的一个非常好的渠道。我们在大型系统中学习设计模式的运用,领悟它的设计思考、灵活运用,既...

    Android期末设计报告.docx

    五子棋游戏的开发不仅是一个简单的游戏编写过程,更重要的是在系统分析和设计阶段所做的工作,本文在设计过程中严格遵循软件工程学的方法,用分段的生命周期计划严格管理,并主要讲述了程序的总体设计,详细设计阶段...

    Android代码-APlayer

    遵循 Material Design 设计,UI清新简洁,操作简单,功能齐全 下载地址:https://www.coolapk.com/apk/remix.myplayer 截图 特点 首页Tab可配置,最多支持五个,包括歌曲、艺术家、专辑、文件夹、播放列表 专辑、...

    精通ANDROID 3(中文版)1/2

    23.5.1 在Android搜索中使用操作键  23.5.2 使用应用程序特定的搜索上下文  23.6 资源  23.7 对平板电脑的意义  23.8 小结  第24章 文本到语音转换  24.1 Android中的文本到语音转换  24.2 使用语段...

    Android中WebView的一些简单用法

    一直想写一个关于 WebView 控件的 一些简单运用,都没什么时间,这次也是挤出时间写的,里面的一些基础知识就等有时间再更新讲解一下,今天就先把项目出来做一些简单介绍,过多的内容可以看我的源码,都传到github上...

    基于android的视频播放器---开题报告.doc

    计算机的广泛运用,手机市场的迅速发展,各种音频视频" "资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少" "的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外...

    Android_Source_Analysis:Android SDK原始解析-预测帮助Android开发者更好的学习Android!

    该项目通过分析Android系统中的设计模式来提升大家对设计模式的理解,从内核的角度来剖析既增加了对Android系统本身的了解,也从优秀的设计中领悟模式的实际运用以及它适用的场景,避免在实际开发中的生搬硬套。...

    精通Android 3 (中文版)2/2

    23.5.1 在Android搜索中使用操作键  23.5.2 使用应用程序特定的搜索上下文  23.6 资源  23.7 对平板电脑的意义  23.8 小结  第24章 文本到语音转换  24.1 Android中的文本到语音转换  24.2 使用语段...

    android实训报告.docx

    本次设计便是利用开发工具eclipse和SQlite数据库共同开发的一个android客户端的火车票订购系统,它能方便快捷地运用在火车站订票业务的营运之中。该系统要解决的是火车站网上售票工作所要解决的问题,可以满足火车...

    Android典型技术模块开发详解

    3.5 Activity加载模式 3.6 本章小结 第4章 Intent (意图) 4.1 显式Intent 4.2 隐式Intent 4.2.1 IntentFilter 4.2.2 调用系统组件 4.3 本章小结 第5章 BroadcastReceiver (广播) 5.1 生命周期 5.2 广播类型 ...

    android实训报告(2).docx

    本次设计即是利用开发工具eclipse和SQlite数据库一路开发的一个android客户端的火车票订购系统,它能方便快捷地运用在火车站订票业务的营运当中。该系统要解决的是火车站网上售票工作所要解决的问题,能够知足火车...

    android实训报告(1).doc

    本次设计便是利用开发工具eclipse和SQlite数据库共同开发的一个android客户端的 火车票订购系统,它能方便快捷地运用在火车站订票业务的营运之中。该系统要解决的 是火车站网上售票工作所要解决的问题,可以满足...

    AndroidProject案例集合

    作者AndroidHJS,源码AndroidProject,简单说几句 敲这个项目也是一时兴起,但是在敲这个项目过程,发现越敲越有劲。可以把自己在CSDN,掘金,干货集中营看到酷炫的效果运用到这个项目,有时候我也可以通过这个项目去...

    JAVA上百实例源码以及开源项目源代码

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    chrome.exe

    ·具备隐私浏览模式,可以让用户无需在本地机器上登录即可使用,这个功能与微软IE8中的Incognito类似。 ·浏览器将内置防止“网络钓鱼“及恶意软件功能。 Google曾在自己的官方博客中宣布在Beta版Chrome25 中将...

    Google Chrome 6.0.451.0 Dev 版(一个由Google公司开发的网页浏览器)

     分页是Chrome使用者界面中最重要的元素,为梯形设计,其位于窗口的最上方而非控制按钮的下方(与Opera类似)。这项改变与许多目前的分页浏览器做法不同。不同窗口的分页可轻易的利用拖曳的方式交换配置。每一个...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics