Android建造者模式笔记

前言

最近在进行Android编程的时候,通过自己的体会和查看学习别人的代码对Android建造者模式有了自己的理解,这里就做一个笔记,以供参考。建造者模式是一种常见的软件设计模式,因为我目前主要在Android平台上进行编程,所以就用Android代码举例子。如果写的不是很详细的话,请见谅。

什么是建造者模式

首先,什么是建造者模式。建造者模式是设计模式的一种,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
如下图[百度百科]:
百度百科
建造者模式一般有四个角色:

  • 抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。
  • 具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
  • 导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。
  • 产品(Product)角色:产品便是建造中的复杂对象。

一般来说,每有一个产品者,就有一个相应的具体建造者。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。

这些都是一些定义类的语言,后面举例子。

Android例子

Android中AlertDialog是一个建造者模式的例子,可以有着不同的样式和呈现,这样通过Builder就可以有效实现构建和表示的分离。

不过我后面要提的例子是Paginate,它是Github上的一个开源库。它的作用是:Library for creating simple pagination functionality upon RecyclerView and AbsListView。(为AbsListView和RecyclerView 提供简单的分页功能。)

它的构造是:

paginate = Paginate.with(refreshView, this)
        .setLoadingTriggerThreshold(2)
        .addLoadingListItem(loadListener != null)
        .build();

它的主干代码如下:
AbsListViewPaginate.java

package com.paginate.abslistview;

import android.database.DataSetObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.HeaderViewListAdapter;

import com.paginate.Paginate;

public final class AbsListViewPaginate extends Paginate implements EndScrollListener.Callback {
   

    private final AbsListView absListView;
    private final Callbacks callbacks;
    private EndScrollListener scrollListener;
    private WrapperAdapter wrapperAdapter;

    AbsListViewPaginate(AbsListView absListView,
                        Paginate.Callbacks callbacks,
                        int loadingTriggerThreshold,
                        AbsListView.OnScrollListener onScrollListener,
                        boolean addLoadingListItem,
                        LoadingListItemCreator loadingListItemCreator) {
        this.absListView = absListView;
        this.callbacks = callbacks;

        // Attach scrolling listener in order to perform end offset check on each scroll event
        scrollListener = new EndScrollListener(this);
        scrollListener.setThreshold(loadingTriggerThreshold);
        scrollListener.setDelegate(onScrollListener);
        absListView.setOnScrollListener(scrollListener);

        if (addLoadingListItem) {
            BaseAdapter adapter;
            if (absListView.getAdapter() instanceof BaseAdapter) {
                adapter = (BaseAdapter) absListView.getAdapter();
            } else if (absListView.getAdapter() instanceof HeaderViewListAdapter) {
                adapter = (BaseAdapter) ((HeaderViewListAdapter) absListView.getAdapter()).getWrappedAdapter();
            } else {
                throw new IllegalStateException("Adapter needs to be subclass of BaseAdapter");
            }

            // Wrap existing adapter with new adapter that will add loading row
            wrapperAdapter = new WrapperAdapter(adapter, loadingListItemCreator);
            adapter.registerDataSetObserver(dataSe
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值