Android常用8种设计模式(二)(1)

synchronized (mSelfObserverLock) {

mContentObservable.dispatchChange(selfChange);

if (mNotifyUri != null && selfChange) {

mContentResolver.notifyChange(mNotifyUri, mSelfObserver);

}

}

}

protected void notifyDataSetChange() {

mDataSetObservable.notifyChanged();

}

}

再看看Observable类和DataSetObservable类:

public abstract class Observable {

/**

  • 观察者列表

*/

protected final ArrayList mObservers = new ArrayList();

public void registerObserver(T observer) {

if (observer == null) {

throw new IllegalArgumentException(“The observer is null.”);

}

synchronized(mObservers) {

if (mObservers.contains(observer)) {

throw new IllegalStateException(“Observer " + observer + " is already registered.”);

}

mObservers.add(observer);

}

}

public void unregisterObserver(T observer) {

if (observer == null) {

throw new IllegalArgumentException(“The observer is null.”);

}

synchronized(mObservers) {

int index = mObservers.indexOf(observer);

if (index == -1) {

throw new IllegalStateException(“Observer " + observer + " was not registered.”);

}

mObservers.remove(index);

}

}

public void unregisterAll() {

synchronized(mObservers) {

mObservers.clear();

}

}

}

public class DataSetObservable extends Observable {

/**

  • 数据发生变化时,通知所有的观察者

*/

public void notifyChanged() {

synchronized(mObservers) {

for (DataSetObserver observer : mObservers) {

observer.onChanged();

}

}

}

//… … (其他方法)

}

观察者DataSetObserver类是一个抽象类:

public abstract class DataSetObserver {

public void onChanged() {

// Do nothing

}

}

所以我们具体看它的子类:

public class AlphabetIndexer extends DataSetObserver{

/*

  • @hide 被android系统隐藏起来了

*/

@Override

public void onChanged() {

//观察到数据变化,观察者做自己该做的事情

super.onChanged();

mAlphaMap.clear();

}

}

ContentObserver也是类似。

4.效果

(1).行为型模式

(2).目标和观察者间的抽象耦合(经典实现)。

(3).支持广播通信(相信这点android开发者看到后应该有启发吧)。

(4).注意意外的更新,这也是观察者更新进行管理的原因之一。

代理模式请参看:

http://blog.csdn.net/qq_27489007/article/details/53426428

命令模式,在.net,java平台的事件机制用的非常多,几乎每天都与之打交道。

android中对我印象最深的就是多线程多进程的环境,所以必然大量使用到Runbable,Thread,其实用的就是最简单的命令模式。

命令模式,Command Pattern,把请求封装为一个对象,多么巧妙的一个说法啊。

1.意图

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

热门词汇:动作 事物 请求封装 排队 打包 异步

2.结构

Command接口提供了Execute方法,客户端通过Invoker调用命令操作来调用Recriver,绕了一大圈,

但是却把具体对Receiver的操作请求封装在具体的命令中,是客户端对recriver的操作清晰简明。

但是在实际项目中,我们常常忽略Receiver,而把命令对象的目标对象直接设置为子类自己的成员变

量或者作为execute()方法的临时变量。

以Android中的Runnable(在java.lang包下)为例,我们画出UML结构图如下:

想不到我们天天写的代码无意识中就是用到了命令模式,所谓模式,就是无所不在。

3.代码

命令接口Runnable定义如下:

public interface Runnable {

public abstract void run();

}

调用者Thread简化版代码:

//命令模式这里不需要继承Runnable接口,但是这里考虑到实际情况,比如方便性等,继承了Runnable接口,实现了run方法,这个是Thread自身的运行run的方法

class Thread implements Runnable {

private Runnable target;

public Thread(Runnable target) {

this.target = target;

}

public synchronized void start() {

if (threadStatus != 0 || this != me)

throw new IllegalThreadStateException();

group.add(this);

start0();//这个是本地方法,调用run方法

if (stopBeforeStart) {

stop0(throwableFromStop);

}

}

//可选

public void run() {

if (target != null) {

最后

我这里整理了一份完整的学习思维以及Android开发知识大全PDF。

当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。

参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF
d(this);

start0();//这个是本地方法,调用run方法

if (stopBeforeStart) {

stop0(throwableFromStop);

}

}

//可选

public void run() {

if (target != null) {

最后

我这里整理了一份完整的学习思维以及Android开发知识大全PDF。

[外链图片转存中…(img-xTFgImxy-1724145598747)]

当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。

参考docs.qq.com/doc/DSkNLaERkbnFoS0ZF

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值