简单介绍一下 设计模式在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项目时,用到的设计模式,自己的一些体会,与大家一起分享,交流,共同进步.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值