装饰设计模式在Android开发中的应用

开源新作,安卓驱动工程师面试题 前言 Offer: 腾讯,头条 ,网易互娱 ,bigo ,虎牙 挂了: 阿里,华为,cvte 今年移动端确实很好找工作,主要复习时间是4月 – 8月, 其中6月开始入职腾讯,开启苦逼又牛逼的边实习边复习模式。 8月底离职腾讯后,可能是转正希望足够大,也可能是前面压抑得太久,直接就进入放飞自我模式,基本放下了学习。 只有在出发去面试的路上,复习一下缓解紧张。 以下是本人对如何准备面试的看法,基于本人非常有限的经验,各位看官看看即好。 1.你所知道的设计模式有哪些? 参考回答 创建型模式,共五种:工厂方法 阅读详情
1. 模式定义

装饰设计模式也称包装设计模式,用来动态的扩展对象的功能,也是继承关系的的一种替代方案之一。在不使用的继承的方式下,采用装饰设计模式可以扩展一个对象的功能,可以使一个对象变得越来越强大。

2. Android 源码的学习和思考

相信用过 ListView 的朋友都知道,ListView 有自带的方法可以添加 header 和 footer,那么 ListView 是怎样做到的呢?

ListView.java 的源码

ArrayList<FixedViewInfo> mHeaderViewInfos = Lists.newArrayList();
ArrayList<FixedViewInfo> mFooterViewInfos = Lists.newArrayList();

public void addHeaderView(View v, Object data, boolean isSelectable) {
        if (v.getParent() != null && v.getParent() != this) {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "The specified child already has a parent. "
                           + "You must call removeView() on the child's parent first.");
            }
        }
        final FixedViewInfo info = new FixedViewInfo();
        info.view = v;
        info.data = data;
        info.isSelectable = isSelectable;
        mHeaderViewInfos.add(info);
        mAreAllItemsSelectable &= isSelectable;

        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {
            if (!(mAdapter instanceof HeaderViewListAdapter)) {
                wrapHeaderListAdapterInternal();
            }

            // In the case of re-adding a header view, or adding one later on,
            // we need to notify the observer.
            if (mDataSetObserver != null) {
                mDataSetObserver.onChanged();
            }
        }
    }
    
protected void wrapHeaderListAdapterInternal() {
        mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, mAdapter);
    }
    
protected HeaderViewListAdapter wrapHeaderListAdapterInternal(
            ArrayList<ListView.FixedViewInfo> headerViewInfos,
            ArrayList<ListView.FixedViewInfo> footerViewInfos,
            ListAdapter adapter) {
        return new HeaderViewListAdapter(headerViewInfos, footerViewInfos, adapter);
    }

类关系

public interface WrapperListAdapter extends ListAdapter {
    /**
     * Returns the adapter wrapped by this list adapter.
     *
     * @return The {@link android.widget.ListAdapter} wrapped by this adapter.
     */
    public ListAdapter getWrappedAdapter();
}

-----------------------------------------------

public class HeaderViewListAdapter implements WrapperListAdapter, Filterable {
    ...
}

可以看到 adapter 是 HeaderViewListAdapter 的子类的时候,会最终将 headerView 和 footerView 配置到 HeaderViewListAdapter 中实现。那么 HeaderViewListAdapter 是怎样实现的呢?

HeaderViewListAdapter.java 主要源码

public class HeaderViewListAdapter implements WrapperListAdapter, Filterable {

    private final ListAdapter mAdapter;

    ArrayList<ListView.FixedViewInfo> mHeaderViewInfos;
    ArrayList<ListView.FixedViewInfo> mFooterViewInfos;

    static final ArrayList<ListView.FixedViewInfo> EMPTY_INFO_LIST =
        new ArrayList<ListView.FixedViewInfo>();
        
    public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos,
                                 ArrayList<ListView.FixedViewInfo> footerViewInfos,
                                 ListAdapter adapter) {
        mAdapter = adapter;
        ...
        if (headerViewInfos == null) {
            mHeaderViewInfos = EMPTY_INFO_LIST;
        } else {
            mHeaderViewInfos = headerViewInfos;
        }

        if (footerViewInfos == null) {
            mFooterViewInfos = EMPTY_INFO_LIST;
        } else {
            mFooterViewInfos = footerViewInfos;
        }
        ...
    }
    
    public boolean removeHeader(View v) {
        for (int i = 0; i < mHeaderViewInfos.size(); i++) {
            ListView.FixedViewInfo info = mHeaderViewInfos.get(i);
            if (info.view == v) {
                mHeaderViewInfos.remove(i);

                mAreAllFixedViewsSelectable =
                        areAllListInfosSelectable(mHeaderViewInfos)
                        && areAllListInfosSelectable(mFooterViewInfos);

                return true;
            }
        }

        return false;
    }

    public boolean removeFooter(View v) {
        for (int i = 0; i < mFooterViewInfos.size(); i++) {
            ListView.FixedViewInfo info = mFooterViewInfos.get(i);
            if (info.view == v) {
                mFooterViewInfos.remove(i);

                mAreAllFixedViewsSelectable =
                        areAllListInfosSelectable(mHeaderViewInfos)
                        && areAllListInfosSelectable(mFooterViewInfos);

                return true;
            }
        }

        return false;
    }
    
    public int getCount() {
        if (mAdapter != null) {
            return getFootersCount() + getHeadersCount() + mAdapter.getCount();
        } else {
            return getFootersCount() + getHeadersCount();
        }
    }
    
    public Object getItem(int position) {
        // Header (negative positions will throw an IndexOutOfBoundsException)
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {
            return mHeaderViewInfos.get(position).data;
        }

        // Adapter
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getCount();
            if (adjPosition < adapterCount) {
                return mAdapter.getItem(adjPosition);
            }
        }

        // Footer (off-limits positions will throw an IndexOutOfBoundsException)
        return mFooterViewInfos.get(adjPosition - adapterCount).data;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
        // Header (negative positions will throw an IndexOutOfBoundsException)
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {
            return mHeaderViewInfos.get(position).view;
        }

        // Adapter
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mAdapter != null) {
            adapterCount = mAdapter.getCount();
            if (adjPosition < adapterCount) {
                return mAdapter.getView(adjPosition, convertView, parent);
            }
        }

        // Footer (off-limits positions will throw an IndexOutOfBoundsException)
        return mFooterViewInfos.get(adjPosition - adapterCount).view;
    }

}

可以看到,HeaderViewListAdapter 在 ListAdapter 的基础上,且不修改 原有开发者自行定义的 Adapter下,对 ListView 提供了支持 header 和 footer 的添加。所以, ListView 的源码是通过装饰设计模式让其具有添加 header 和 footer 的能力。

RecycleView 没有相关的方法,应该怎样才可以 添加 header 和 footer?这时,通过学习 ListView 的源码后,不就可以使用装饰设计模式轻松解决问题了吗?!

2. 使用装饰设计模式让 RecycleView 也可添加 header 和 footer

好,那么我们从装饰 Adapter 入手,鉴于本文是介绍如何使用装饰设计模式解决问题,此处实例仅供参考学习,如实际应用有问题,应自行完善和拓展

自己动手写一个 HeaderViewListAdapter.java

public class HeaderViewListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    // 装饰 RecyclerView.Adapter
    private final RecyclerView.Adapter mRealAdapter;
    ArrayList<View> mHeaderViews;
    ArrayList<View> mFooterViews;

    public HeaderViewListAdapter(RecyclerView.Adapter realAdapter){
        this.mRealAdapter = realAdapter;

        mRealAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onChanged() {
                notifyDataSetChanged();
            }
        });

        mHeaderViews = new ArrayList<>();
        mFooterViews = new ArrayList<>();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
        // 头部返回 头部的ViewHolder
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {
            return createHeaderFooterViewHolder(mHeaderViews.get(position));
        }
        // mRealAdapter 返回 mRealAdapter的ViewHolder
        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mRealAdapter != null) {
            adapterCount = mRealAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                // 直接传 position ,不兼容 万能适配多布局条目
                return mRealAdapter.onCreateViewHolder(parent,mRealAdapter.getItemViewType(adjPosition));
            }
        }
        // 底部返回 底部的ViewHolder
        // Footer (off-limits positions will throw an IndexOutOfBoundsException)
        return createHeaderFooterViewHolder(mFooterViews.get(adjPosition - adapterCount));
    }

    private RecyclerView.ViewHolder createHeaderFooterViewHolder(View view) {
        return new RecyclerView.ViewHolder(view){};
    }

    public int getHeadersCount() {
        return mHeaderViews.size();
    }

    public int getFootersCount() {
        return mFooterViews.size();
    }

    @Override
    public int getItemViewType(int position) {
        // 把位置作为 viewType
        return position;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // 这个方法先不写,测试一下
        // 头部和底部是都不需要做处理的,只要 mRealAdapter 要去做处理
        int numHeaders = getHeadersCount();
        if (position < numHeaders) {
            return ;
        }

        final int adjPosition = position - numHeaders;
        int adapterCount = 0;
        if (mRealAdapter != null) {
            adapterCount = mRealAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                mRealAdapter.onBindViewHolder(holder,position);
            }
        }
    }

    @Override
    public int getItemCount() { // 总共返回多少条 = 底部条数+头部条数+真实的Adapter条数
        return mFooterViews.size()+mHeaderViews.size()+mRealAdapter.getItemCount();
    }

    /**
     * 添加头部
     * @param view
     */
    public void addHeaderView(View view){
        if(!mHeaderViews.contains(view)){
            mHeaderViews.add(view);
            notifyDataSetChanged();
        }
    }

    /**
     * 添加底部
     * @param view
     */
    public void addFooterView(View view){
        if(!mFooterViews.contains(view)){
            mFooterViews.add(view);
            notifyDataSetChanged();
        }
    }

    /**
     * 移除头部
     * @param view
     */
    public void removeHeaderView(View view){
        if(mHeaderViews.contains(view)){
            mHeaderViews.remove(view);
            notifyDataSetChanged();
        }
    }

    /**
     * 移除底部
     * @param view
     */
    public void removeFooterView(View view){
        if(mFooterViews.contains(view)){
            mFooterViews.remove(view);
            notifyDataSetChanged();
        }
    }
}

ListView 中直接提供了方法添加 header 和 footer,那我们需要自定义拓展 RecyclerView 来添加相关的方法

HeaderViewRecyclerView.java

public class HeaderViewRecyclerView extends RecyclerView{

    private HeaderViewListAdapter mAdapter;

    public HeaderViewRecyclerView(Context context) {
        super(context);
    }

    public HeaderViewRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public HeaderViewRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setAdapter(Adapter adapter) {
        mAdapter = new HeaderViewListAdapter(adapter);
        super.setAdapter(mAdapter);
    }

    /**
     * 添加头部
     * @param view
     */
    public void addHeaderView(View view){
        // 必须要设置 Adapter 之后才能添加头部和底部
        if(mAdapter != null){
            mAdapter.addHeaderView(view);
        }
    }

    /**
     * 添加底部
     * @param view
     */
    public void addFooterView(View view){
        if(mAdapter != null){
            mAdapter.addFooterView(view);
        }
    }

    /**
     * 移除头部
     * @param view
     */
    public void removeHeaderView(View view){
        if(mAdapter != null){
            mAdapter.removeHeaderView(view);
        }
    }

    /**
     * 移除底部
     * @param view
     */
    public void removeFooterView(View view){
        if(mAdapter != null){
            mAdapter.removeFooterView(view);
        }
    }
}
3. 使用示例
        mRecyclerView.setAdapter(new RecyclerAdapter());
        View headerView = LayoutInflater.from(this).inflate(R.layout.layout_header_view,mRecyclerView,false);
        mRecyclerView.addHeaderView(headerView);
        View footerView = LayoutInflater.from(this).inflate(R.layout.layout_header_view,mRecyclerView,false);
        mRecyclerView.addFooterView(headerView);

其实,就是正常操作使用 RecyclerView,addHeaderView 和 addFooterView 需在 setAdapter 后。

希望读者能从中感受到到 装饰设计模式 的魅力。

【Python深度学习】做深度学习训练时,如果数据集太大,无法一次性加载进GPU,应该如何做? 方法核心思想优点缺点适用场景实现复杂度小批量训练(Mini-Batch Training)与数据加载器(DataLoader)将数据集划分为小批量,每次只加载一个小批量到GPU中进行训练。- 易于实现- 是深度学习的标准做法- 支持多进程加载- 内存可能成为瓶颈- 需要调整批量大小避免内存不足适用于大部分场景低数据分片与分布式训练(Data Sharding & Distributed Training)将数据集分片,每个GPU或节点处理其中一部分数据,分布式训练。 阅读详情

相关推荐

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 473

结构型设计模式

结构设计模式的典型例题!

weixin_62540487的博客 3480

【电路设计】带阻滤波器实战:从理论到Twin-T陷波电路实现

本文详细介绍了带阻滤波器的原理与Twin-T陷波电路的实战应用,从基础概念到工程实现全面解析。通过具体案例展示如何设计高Q值滤波器,解决电源噪声等实际问题,并分享PCB布局和元件选型的实用技巧,助力工程师提升电路设计能力。

gg901的博客 1011

装饰器模式

装饰器模式又称包装模式,是一种结构型模式。这种设计模式是指能够在一个类的基础上增加一个装饰类(也可以叫包装类),并在装饰类中增加一些新的特性和功能。这样,通过对原有类的包装,就可以在不改变原有类的情况下为原有类增加更多的功能。 Phone接口,它规定了发送和接收语音的抽象方法。 public interface Phone { String callIn(); Boolean callOut(String info); } 然后定义一个类 TelePhon.

java后端开发 322

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1748

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4593

Android设计模式——装饰模式

装饰模式的理解和使用。

qq_32403767的博客 227

《详细指南:本地部署Ollama大型模型的完整步骤》

通过本指南,您应该能够成功地在本地部署Ollama大型模型,并开始使用它进行各种AI任务。Ollama的易用性和高性能使其成为研究和开发的理想选择。Ollama是一个高性能的AI模型部署平台,支持在本地轻松部署大型语言模型。本指南将详细介绍如何在本地环境中部署Ollama,并运行一个大型模型。

eclipsercp的博客 3696

Android设计模式详解之装饰模式

装饰模式也称为包装模式,结构型设计模式之一;动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活;需要透明且动态地扩展类的功能时;UML类图:抽象组件,可以是一个接口或抽象类,充当的就是被装饰的原始对象;组件具体实现类了;该类是Component类的基本实现,也是我们装饰的具体对象;抽象装饰者,为了装饰我们的组件对象,内部持有一个指向组件对象的引用,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类;装饰者具体实现类,对抽象装饰者的具体实现;

故不积跬步无以至千里 1259

基于STM32姿态解算-正点原子ATK-IMU901模块标准库开发——正点原子串口角度传感器模块十轴IMU加速度气压计陀螺仪_资料编号29

购买了正点原子的ATK-IMU901模块后,发现例程给的是HAL库的,本项目将HAL库例程转换为库函数版本(基于STM32)。实战开发,亲测无误。

嵌入式阿齐Archie 3864

如何使用PostgreSQL数据库进行数据仓库的ETL操作

本文旨在为数据工程师、数据库管理员和分析师提供使用PostgreSQL进行数据仓库ETL操作的全面指南。ETL流程的基本原理PostgreSQL在ETL中的独特优势实际ETL实现的技术细节性能优化和最佳实践常见问题的解决方案首先介绍ETL和PostgreSQL的基本概念然后深入探讨核心技术和实现方法接着提供实际案例和代码示例最后讨论优化技巧和未来趋势ETL:提取(Extract)、转换(Transform)、加载(Load)的缩写,描述数据从源系统移动到目标数据仓库的过程。

2502_91592937的博客 873

华为2015年校园招聘机试题(2)

2015年华为校园招聘机试题

烽火前秦路 895

用MSBlock重塑C2f,让你的模型又轻又强(参数量与精度的双重突破)

打开确保模型解析器能识别MSBlock模块。通过将MSBlock集成到YOLOv8的C2f模块中,我们实现了一个“轻量且多尺度感知”的目标检测模型。这个改进不仅在工程上能降低部署成本、提升推理速度,更在科研上提供了“多尺度+动态核”的创新思路——这种思路可以延伸到其他网络(如ResNet、MobileNet)的改进中,帮你在论文中打造独特的研究点。如果你在实现过程中遇到问题,比如代码报错、训练收敛异常,可以先检查模块集成的每一步是否到位,再尝试调整MSBlock的卷积核尺寸、动态权重的计算方式等超参数。

m0_71589036的博客 105

安卓开发设计模式(二)——结构型设计模式

分析:RecyclerView只依赖Adapter接口,不关心数据来源,UserAdapter持有原始数据List<User>,并实现了RecyclerView.Adapter接口,当RecyclerView需要展示数据时,会调用Adapter的方法,Adapter负责把数据转换成View。代理模式的核心就是找个“中间人”帮你做事,这个“中间人”就是代理,它能控制对原始对象的访问。继承抽象装饰器,重写需要增强的方法,在调用父类(原始组件)方法的前/后加上自己的逻辑,不重写的方法沿用抽象装饰器的默认转发。

. 826

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

安卓开发用到的设计模式(2)结构型模式

本文介绍了安卓开发中常用的五种结构型设计模式:适配器模式(用于RecyclerView和网络请求适配)、装饰器模式(扩展Context功能与View装饰)、代理模式(管理图片加载和权限检查)、桥接模式(实现主题切换和数据存储分离)以及组合模式(构建View树结构和菜单层级)。这些模式通过解耦接口与实现、复用对象结构等方式,有效提升了代码的可维护性和扩展性,是安卓开发中的核心架构思想。

分享Android应用和系统开发、音视频编码、性能优化相关知识 1213

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 装饰者模式

private void t() { contextImp imp=new contextImp(); imp.startActivity(); activity activity=new activity(imp); activity.startActivity(); } public abstract c...

一航jason 150

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式-装饰者模式(Decorator)理解和在Android中的应用

介绍最近写代码没有手感,就看看书找点写代码的灵感。看点高大上的设计模式谈谈自己的理解。我读的是《研磨设计模式》看完之后真正的醍醐灌顶。借用一句话 一本值得反复研读的书 读了设计模式,其实我觉得看Android源码不是一行一行的看,毕竟源码的代码太多,其实很多都是输入检查非空判断异常处理等,如果只是关心的关键的实现步骤抓重点的话,就找到关键实现就好了。这话说得有点绕。我们怎么知道什么是重点。这就

李可乐的专栏 8741

android 装饰模式应用

一、定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实对象。 二、特点 (1) 装饰对象和真实对象有相同的接口,这样客户端对象能以和真实对象相同的方式和装饰对象交互。 (这一点和代理相似,只是侧重点不同,代理侧重隐藏被代理类,装饰侧重扩展被装饰的对象) (2) 装饰对象包含一个真实对象的引用(reference) (3...

geyuecang的博客 532

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,为了避免这种苦难的发生,从而设计出来的这种设计模式,所以这篇文章中我会带领大家遇见这种困难,从而使用设计模式解决这种困难,最后大家就会明白什么是设计者模式,什么时候应该使用设计者模式以及如何使用设计者模

阿拉灯神灯的专栏 7034

android设计模式之装饰模式

装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态扩展对象的功能,同时它也是继承关系的一种替代方案之一。(组合方案也是继承关系的一种替代方案)。   装饰模式的定义 动态给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更加灵活。   装饰模式的使用场景 需要透明且动态地扩展...

且听真言 959

Android设计模式应用-装饰器模式

给一个对象动态的添加方法,就是装饰器模式,通常的做法就是将   原始对象作为一个参数传递给  装饰者构造器 它的目的:是扩展,不是访问 设计模式原则中,就有对扩展开放,对修改关闭 public interface Sourceable {      public void method();  }   public class Source impl

wust小吴 836

从装饰者模式到Context类族

本着不学习就要落后,落后就要挨打的态度,我也开始捣鼓起了设计模式。但只看设计模式又不免有些索然无味,索性就连Android源码也一起研究研究,现在看来效果不错。昨天晚上刚看了装饰者模式,正好今天总结一番分享给大家。新手上路,如有不足之处,还请大家多指教。

PleaseCallMeCoder 3551

Android设计模式之装饰器模式

截止目前为止,我已经学了四个设计模式了,首先回顾一下这几天学习设计模式的感悟,第一个接触的当然就是单例模式了,单例模式由于将构造方法私有化,因此在类的外面不能创造该类的对象,那么问题来了,那我们就在类的里面得到该类的对象,且该类的对象而且是唯一的,就是这样。接着学习了责任链模式,责任链模式不用多说,就是一条链式结构,该模式的核心思想就是将职责沿着一条链式结构进行传递。接着就是原型模式,原型模式感觉

u014675538的博客 1030

Android中装饰者模式

常用设计模式 装饰者模式 举例 例子 实战应用 分析 讲解

u014769864的博客 1408

23种设计模式之-装饰者模式(Android应用场景介绍)

装饰者模式,就是在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能),这个模式在java类中文件流读写类中比较常见。在开发中Android应用的也比较常见,咱们就先来介绍一下Android中的应用吧。 咱们先看看大神怎么用的,刷新控件想必大家都用过,SmartRefreshLayout这个控件应该有蛮多人用过的。GitHub上有19k star了...

qq_19764133的博客 895

android之装饰设计模式

定义 在不使用继承的前提下,动态的扩展一个类的功能,就叫做装饰设计模式。 android里面使用装饰设计模式的有Context,ListView添加和删除头部尾部布局,还有IO流等等。那么到底如何动态的扩展一个类的功能呢?请看如下分析。 ...

北京流年 262
上一篇: 工厂设计模式在Android开发中的应用
下一篇: 策略设计模式在Android开发中的应用
胡小明同学
博客等级 码龄10年 35粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值