Android 适配器(Adapter)、观察者(Observer) 模式

本文详细解析了适配器(Adapter)模式与观察者(Observer)模式在Android开发中的应用,包括AdapterView体系与Adapter体系的工作原理,以及如何通过DataSetObserver观察数据集的变化并触发UI更新。

适配器(Adapter)详述:http://blog.youkuaiyun.com/jjwwmlp456/article/details/39893723

观察者(Observer)详述:http://blog.youkuaiyun.com/jjwwmlp456/article/details/39967021


AdapterView 体系


AdapterView中会使用Adapter


Adapter 体系


BaseAdapter 实现了 SpinnerAdapter、ListAdapter

这样的形式,就是 适配器模式的应用, 这里是采用的是 接口适配器


观察者(Observer) 模式

在Adapter中定义了注册和反注册DataSetObserver的方法

public interface Adapter {
  
    void registerDataSetObserver(DataSetObserver observer);

    void unregisterDataSetObserver(DataSetObserver observer);

    ...
}

public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }

    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
    ...
}
public class DataSetObservable extends Observable<DataSetObserver> {

    public void notifyChanged() {
        synchronized(mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }

    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}
public abstract class Observable<T> {

    protected final ArrayList<T> mObservers = new ArrayList<T>();

    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();
        }
    }
}

DataSetObserver 观察者(观察数据集:发生变化onChanged、无效onInvalidated)

Observable 处理观察者(添加、移除、注册、反注册)

DataSetObservable extendsObservable<DataSetObserver> 添加了通知数据改变和无效的 两个方法


在AdapterView中

class AdapterDataSetObserver extends DataSetObserver {

        private Parcelable mInstanceState = null;

        @Override
        public void onChanged() {
            mDataChanged = true;
            mOldItemCount = mItemCount;
            mItemCount = getAdapter().getCount();

            // Detect the case where a cursor that was previously invalidated has
            // been repopulated with new data.
            if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
                    && mOldItemCount == 0 && mItemCount > 0) {
                AdapterView.this.onRestoreInstanceState(mInstanceState);
                mInstanceState = null;
            } else {
                rememberSyncState();
            }
            checkFocus();
            requestLayout();
        }

        @Override
        public void onInvalidated() {
            mDataChanged = true;

            if (AdapterView.this.getAdapter().hasStableIds()) {
                // Remember the current state for the case where our hosting activity is being
                // stopped and later restarted
                mInstanceState = AdapterView.this.onSaveInstanceState();
            }

            // Data is invalid so we should reset our state
            mOldItemCount = mItemCount;
            mItemCount = 0;
            mSelectedPosition = INVALID_POSITION;
            mSelectedRowId = INVALID_ROW_ID;
            mNextSelectedPosition = INVALID_POSITION;
            mNextSelectedRowId = INVALID_ROW_ID;
            mNeedSync = false;

            checkFocus();
            requestLayout();
        }

        public void clearSavedState() {
            mInstanceState = null;
        }
    }

自定义了AdapterDataSetObserver,在两个实现方法中都调用了requestLayout(),重新设置layout

整个观察数据变化导致界面改变的流程:
1. 在AdapterView体系中 自定义AdapterDataSetObserver,并注册(即添加observer到observable)。

2. 在调用adapter.notifyDataSetChanged()后,内部执行observable的notifyChanged(),

将执行每一个observer的onChanged(),也就达到了更新界面的效果。

notifyDataSetInvalidated同理



### 工厂模式观察者模式适配器模式的简要描述 #### 1. **工厂模式** 工厂模式是一种创建型设计模式,其核心目的是将对象的创建过程封装起来,从而使客户端无需关注具体的类名或实例化细节。它主要分为简单工厂模式、工厂方法模式和抽象工厂模式三种形式。 - 简单工厂模式通过一个集中化的工厂类来决定返回哪一个产品类的实例[^1]。 - 工厂方法模式允许子类决定创建哪种产品的实例,从而将具体的产品创建逻辑延迟到子类中实现。 - 抽象工厂模式提供了一组接口用于生产一系列相关或相互依赖的对象,而不需要指定它们的具体类。 这种方式能够显著提高代码的灵活性和扩展性,因为新增加的产品只需修改工厂部分即可完成集成,而不必改动现有客户代码[^1]。 ```python class ProductFactory: @staticmethod def create_product(type): if type == 'A': return ConcreteProductA() elif type == 'B': return ConcreteProductB() class ConcreteProductA(Product): pass class ConcreteProductB(Product): pass ``` --- #### 2. **观察者模式** 观察者模式属于行为型设计模式之一,主要用于建立一对多的关系,让多个观察者对象同时监听某一个主题对象的状态变化。一旦这个主题发生变化,则会自动通知所有的观察者对象,使他们有机会做出响应动作[^2]。 此模式的优点在于降低了模块间的耦合程度,并支持广播通信功能;然而也可能带来性能开销过大等问题,比如当存在大量观察者时会造成资源浪费或者因循环引用而导致内存泄露风险增加等情况发生[^4]。 ```python from abc import ABC, abstractmethod class Subject(ABC): _observers = [] def attach(self, observer): self._observers.append(observer) def detach(self, observer): self._observers.remove(observer) def notify(self): for obs in self._observers: obs.update(self) class Observer(ABC): @abstractmethod def update(self, subject): pass class ConcreteSubject(Subject): def __init__(self): super().__init__() self.state = None def set_state(self, state): self.state = state self.notify() class ConcreteObserver(Observer): def update(self, subject): print(f"Received notification from {subject.__class__.__name__}: State is now {subject.state}") ``` --- #### 3. **适配器模式** 适配器模式是一种结构型设计模式,旨在解决已有组件与新需求间不兼容的问题。它通过引入一个新的适配层,把不符合当前接口规范的老部件转换成符合预期的新版本接口形式供调用方使用[^3]。此类技术特别适用于第三方库迁移改造项目当中,既保留原有业务逻辑不变又能满足现代框架的要求。 ```java interface Target { void request(); } class Adaptee { public void specificRequest() { System.out.println("Adaptee's Specific Request"); } } class Adapter implements Target { private final Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); // Convert the interface as needed. } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值