组合模式

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在android UI设计,几乎所有的widget和布局类都依靠这两个类。
组合模式,Composite Pattern,是一个非常巧妙的模式。几乎所有的面向对象系统都应用到了组合模式。

将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。
组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。

建造者模式

在Android中经常要使用AlertDialog来显示一些简单的窗口,通常的写法类似下面的代码 :

AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("提示")  .setMessage("确定退出?").create();
dialog.show();  

可以看到dialog是通过Builder创建的,那么Builder是如何同AlertDialog协同工作的呢?其实AlertDialog的创建就是使用Builder模式,废话不多说,直接上代码吧。

备忘录模式

Activity的onSaveInstanceState和onRestoreInstanceState就是通过Bundle这种序列化的数据结构来存储Activity的状态。以便可以恢复Activity在onDestory之前保存的信息。

状态模式

View.onVisibilityChanged方法,就是提供了一个状态模式的实现,允许在View的visibility发生改变时,引发执行onVisibilityChanged方法中的动作。比如View的GONE,VISIBLE状态发生改变时,行为改变。

单例模式

android中有很多系统级别的全局变量,如时间,输入法,账户,状态栏等等,android中对这些都直接或者有些间接用到了单例模式。

观察者模式

在Android中,最典型的观察者模式就是”广播“。
(1)TimelineReceiver是观察者;
(2)重写OnReceive方法,来定义当收到状态变化时,订阅者的行为;

class TimelineReceiver extends BroadcastReceiver { // 1  @Override  public void onReceive(Context context, Intent intent) { // 2  cursor.requery(); // 3  adapter.notifyDataSetChanged(); // 4  Log.d("TimelineReceiver", "onReceived");  }
}  

命令模式

android中用到许多多线程多进程,所以必然大量使用到Runbable,Thread。其实用的就是最简单的命令模式。

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) {target.run();}}
}

客户端只需要new Thread(new Runnable(){}).start()就开始执行相关的一系列的请求,这些请求大部分都是实现Runnable接口的匿名类。

中介者模式

如Resource.getDrawable方法的实现逻辑是这样的:创建一个缓存来存放所有已经加载过的,如果getDrawable中传入的id所对应的Drawable以前没有被加载过,那么它就会根据id所对应的资源类型,分别调用XML解析器生成,或者通过读取包中的图片资源文件来创建Drawable。

而Resource.getDrawable把涉及到多个对象、多个逻辑的操作封装成一个方法,就实现了一个调解者的角色。

代理模式

假设一个Activity A去绑定一个Service S,那么A调用S中的每一个方法其实都是通过系统的Binder机制的中转,然后调用S中的对应方法来做到的。Binder机制就起到了代理的作用。

适配器模式

对于android开发者来说起,适配器模式简直太熟悉不过,有很多应用可以说是天天在直接或者间接的用到适配器模式,比如ListView。
ListView用于显示列表数据,但是作为列表数据集合有很多形式,有Array,有Cursor,我们需要对应的适配器作为桥梁,处理相应的数据(并能形成ListView所需要的视图)。
正是因为定义了这些适配器接口和适配器类,才能使我们的数据简单灵活而又正确的显示到了adapterview的实现类上。

Android:Android涉及到的设计模式相关推荐

  1. android开发模式,Android开发中无处不在的设计模式

    Android开发中无处不在的设计模式――单例模式 Android开发中无处不在的设计模式――Builder模式 前面介绍了单例模式和Builder模式,有兴趣的见上面两个链接,这篇文章侧重介绍1下视 ...

  2. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  3. Android 你应该学会的设计模式MVP

    原文地址点这里 MVP大家最先想到的应该是LOL和CF里面的MVP荣誉吧,玩过的应该都知道指的是Most-Valuable-Player(全场表现最佳DE游戏玩家) 以前也经常玩,平常凌晨一两点,周末 ...

  4. android Android项目构建过程

    今天,简单讲讲android studio如何把写好的工程打包成apk的. 平时开发过程中我们通过android studio编写完成android项目之后直接点击 Run 'app'就可以在buil ...

  5. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

  6. Connor学Android - Android动画

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  7. Android - Android Studio 解决访问被墙的问题

    Android - Android Studio 解决访问被墙的问题 参考文章: (1)Android - Android Studio 解决访问被墙的问题 (2)https://www.cnblog ...

  8. OpenCV2.4.9 For Android + Android Studio (with gradle)配置教程

    OpenCV2.4.9 For Android + Android Studio (with gradle)配置教程 10 回复 / 9501 浏览 本页底部本帖地址 4king2 年前 - 2014 ...

  9. [Android]Android端ORM框架——RapidORM(v2.1)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...

  10. [Android] Android开发优化之——使用软引用和弱引用

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如 ...

最新文章

  1. Redis五大数据结构
  2. 无法更改域名 php网页,WordPress更改新域名后网站无法正常运行怎么办?
  3. 关于CCS软件的Graph功能使用详解
  4. 计算机电子书 2018 BiliDrive 备份
  5. VeryCD将于本月关闭 P2P历史即将终结
  6. 揭秘青岛富二代接班路线 曝红领集团小美女总裁(图)-青青岛社区
  7. 基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)
  8. 不积跬步无以至千里007
  9. 整合ssh时 犯的愚蠢问题
  10. html+canvas 星空背景案例
  11. 微信小程序——瘦金社区
  12. 人机交互新时代:多维度快速看清ChatGPT(附下载)
  13. 搜狗推送接口之搜狗收录怎么做?
  14. 【美萍超市管理系统】汉码盘点机无缝对接 金蝶盘点机条码数据采集器智能终端PDA
  15. Java中为什么不能用“==”判断字符串是否相等
  16. JDK环境变量配置-win10
  17. 软件工程专业就业前景如何 这个几个误区要了解
  18. PHP 获取微视无水印源地址_最新PHP解析抖音获取无水印视频代码
  19. iphoneX底部小黑条适配问题
  20. Oauth2与Spring Security

热门文章

  1. 最常见的客服系统功能
  2. 分类网络:VGG16
  3. ★不容错过的PPT教程!
  4. 代还 支付软件系统来了
  5. 怎样入驻税收洼地?税务筹划能节税到什么程度?
  6. C#开发PACS医学影像三维重建(一):使用VTK重建3D影像
  7. SLF4J 使用手册
  8. 特斯拉美国召回近1.2万辆汽车,软件Bug或导致自动刹车
  9. 基于pytorch搭建ResNet神经网络用于花类识别
  10. java获取上传文件的大小_java 上传文件大小转换为 GB/MB/KB/B