1.组合模式

将对象View和ViewGroup组合成树形结构以表示”部分-整体”的层次结构(View可以做为ViewGroup的一部分)。

public class View{ //... ...
} 
public abstract class ViewGroup extends View{ /** Adds a child view.    */ public void addView(View child) { //... }  public void removeView(View view) { //... } /** Returns the view at the specified position in the group.*/ public View getChildAt(int index) { try { return mChildren[index];  } catch (IndexOutOfBoundsException ex) { return null; } } //other methods
} 

效果 : 能够灵活控制基本对象与组合对象的使用。

2.单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点
以输入法管理者InputMethodManager为例

public final class InputMethodManager {  static final Object mInstanceSync = new Object();//同步  //内部全局唯一实例  static InputMethodManager mInstance;  //对外api  static public InputMethodManager getInstance(Context context) {  return getInstance(context.getMainLooper());  }  /**  * 内部api,供上面的外部api调用  * @hide 系统隐藏的api  */ static public InputMethodManager getInstance(Looper mainLooper) {  synchronized (mInstanceSync) {  if (mInstance != null) {  return mInstance;  }  IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);  IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);  mInstance = new InputMethodManager(service, mainLooper);  }  return mInstance;  }
}  

调用

class ContextImpl extends Context{  @Override  public Object getSystemService(String name) {  if (WINDOW_SERVICE.equals(name)) {  //... ... 省略下面n个if,else if  } else if (INPUT_METHOD_SERVICE.equals(name)) {  //获取输入法管理者唯一实例  return InputMethodManager.getInstance(this);  }  else if (KEYGUARD_SERVICE.equals(name)) {  //... ... 省略下面n个if,else if  } else if (ACCESSIBILITY_SERVICE.equals(name)) {  //又见单例,无处不在  return AccessibilityManager.getInstance(this);  } else if (LOCATION_SERVICE.equals(name)) {  //... ... 省略下面n个if,else if  }  else if (NFC_SERVICE.equals(name)) {  return getNfcManager();  }  return null;  }
}  

效果 : 对唯一实例的受控访问, 避免全局变量污染命名空间, 比类操作更灵活。

3.观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式与回调模式有很多的相似处,简单对比就是:回调是一对一的关系,只监听一个事件;观察者模式则是一个主题,可以有多个监听,观察者模式是一对多的关系。

/* 被观察主题 */
public interface Subject {  public void addObserver(Observer observer);  public void removeObserver(Observer observer);  public void notifyObservers();
}  
/* 观察者 */
public interface Observer {  public void update(String msg);
}  
public class SubjectImp implements Subject{  private  List<Observer> list=new ArrayList<Observer>();  private String msg;  @Override  public void addObserver(Observer observer) {  // TODO Auto-generated method stub  list.add(observer);  }  @Override  public void removeObserver(Observer observer) {  // TODO Auto-generated method stub  int index=list.indexOf(observer);  if(index>=0){  list.remove(index);  }  }  @Override  public void notifyObservers() {  // TODO Auto-generated method stub  for(Observer observer:list){  observer.update(msg);  }  }  public void setMsg(String msg){  this.msg=msg;  notifyObservers();  }  }  
public class ObserverImp implements Observer{  Subject subject;  public ObserverImp(Subject subject){  this.subject=subject;  subject.addObserver(this);  }  @Override  public void update(String msg) {  // TODO Auto-generated method stub  System.out.println("ObserverImp 收到:"+msg);  }  } public class ObserverImp1 implements Observer{  Subject subject;  public ObserverImp1(Subject subject){  this.subject=subject;  subject.addObserver(this);  }  @Override  public void update(String msg) {  // TODO Auto-generated method stub  System.out.println("ObserverImp1 收到:"+msg);  }  }  

调用

SubjectImp subjectImp=new SubjectImp();
ObserverImp observerImp=new ObserverImp(subjectImp);
ObserverImp1 observerImp1=new ObserverImp1(subjectImp);
subjectImp.setMsg("ok");
/* 结果会打印出两条 ObserverImp 收到:ok 和 ObserverImp1 收到:ok */

效果 : 目标和观察者间的抽象耦合,支持广播通信。

4. 策略模式

定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换。
最常用也最常见的使用模式。
最简单的策略模式的实现方式,按照功能分为3个部分,定义算法抽象接口,然后根据具体算法实现这些接口,最后需要定义一个上下文对象。

以最常见的收银台打折、满减为例

//算法的接口
public interface PriceStrategy
{ public int getPrice(int orgPrice);
} 
//实现一个接口,打7折商品
public class sevenPercentStrategy implements PriceStrategy
{
public int getPrice(int orgPrice) { System.out.println("打7折商品"); return orgPrice*0.7; } }
//实现一个接口,满500-100
public class fullMinusStrategy implements PriceStrategy
{
public int getPrice(int orgPrice) { System.out.println("满500-100"); return orgPrice>=500? orgPrice-100 : orgPrice; } } 
//实现一个上下文对象
public class DstPrice
{   private PriceStrategy mPriceStrategy;   public void setPriceMode(PriceStrategy priceMode) {   mPriceStrategy = priceMode;   }   public int ExeCalPrice(int price) {   mPriceStrategy.getPrice(price); }
}   

典型应用:一个典型应用就是Adapter,在我们平时使用的时候,一般情况下我们可能继承BaseAdapter,然后实现不同的View返回,GetView里面实现不同的算法。外部使用的时候也可以根据不同的数据源,切换不同的Adapter。

Android从零单排--常见设计模式相关推荐

  1. 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》

    目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...

  2. android 从零单排 第一期 按键显示helloworld

    啦啦啦- 我是qscqesze 今天开始android的从零单排啦啦啦- 首先从最简单的开始 要求: 程序运行后,单击屏幕上的按键后可以显示一句话,如"Hello World!" ...

  3. 【Android从零单排系列一】《Android系统发展史》

    目录 前言 一.Android 创始人 二.Android 发展历程 三.Android各版本发布时间及特性 1.AndroidBeta:阿童木 2.Android 1.0:发条机器人 3.Andro ...

  4. Android从零单排之免费短信验证

    转载请注明住处:http://blog.csdn.net/crazy1235/article/details/41912003 介绍 短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息 ...

  5. Android从零单排 004 地下工作者Service -配置和使用

    Service 服务 Serivce Tip : 四大组件之一 , 后台, 耗时操作   服务是基于android 提供的四大组件之一,地位也是相当之高,主要作为activity不显示的情况,做一些后 ...

  6. android从零单排之批量删除手机通讯录

    上篇文章,我转载了一片网上关于对android系统通讯录的CRUD操作的经典文章,当时用的lg四太子那款手机进行的测试,完全没问题,但是后来发现,其在删除手机通讯录那块有点问题,因为我后来在其他手机, ...

  7. Android从零单排之Adapter及其子类

    Adapter--适配器,相信大家在开发中少不了用这个类或者它的子类.本人也在很多地方都用到,所以在这里总结一下. Adapter扮演了一个桥梁的角色,把AdapterView和数据源板绑定一起.Ad ...

  8. Android常见设计模式——代理模式(Proxy Pattern)(二)

    文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...

  9. Spring5从零单排学习笔记【非常详细】

    前排 自学网课笔记整理,初次发博,有错的地方各位多多指教. Spring5从零单排学习笔记 文章目录 前排 Spring5从零单排学习笔记 一.Spring5框架概述 二.★IOC容器(Inversi ...

最新文章

  1. AI大佬“互怼”:Bengio和Gary Marcus隔空对谈深度学习发展现状
  2. PageHelper 在 Spring Boot + MyBatis 中合理且规范的使用方法
  3. ubuntu pip更新_Cubietruck开发板折腾002:安装Python管理工具pip
  4. 华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...
  5. python查找文件是否存在_python脚本查找文件是否存在的方法
  6. -bash: mysql_upgrade: command not found
  7. 2016 中国大数据技术大会 相关资料
  8. 初入职场的程序员,不想被时代淘汰?那你必须迈过这个坎!
  9. php 限定字符长度,php-限制字符串长度
  10. 1、试卷名称2013年下半年系统集成项目管理工程师真题
  11. GIS空间分析 栅格数据分析3 可达性分析
  12. 制作游戏3D模型都有哪些步骤流程
  13. Unity自定义创建脚本模板菜单
  14. namespace is terminated
  15. python代码雨_教你用200行Python代码“换脸”
  16. 【算法分析】回溯法解数独(九宫格)算法
  17. 自动化成本高?那么如何获得最高的投资回报呢?
  18. 2022.11.27 第10次周报
  19. 如何用html5实现网页聊天,HTML5 WebSocket实现点对点聊天的示例代码
  20. 设计模式详解:抽象工厂模式

热门文章

  1. 重磅 | 蝉大师首家全面支持59个地区苹果ASM竞价广告数据查询
  2. UGC之殇:如何确保内容安全
  3. 阿里云CentOS独立测试体验报告
  4. 百度晋升王海峰为CTO
  5. 【创新项目实训】Android移动开发教学app案例之飞花令(二)
  6. c++中STL的rope的使用
  7. Part 3R 导数应用与中值定理
  8. 知乎 | 博士生应该采取什么策略读文献?
  9. 计算机ps计划,ps工作室计划书.doc
  10. 如何借鉴一个优秀的网站