Android从零单排--常见设计模式
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从零单排--常见设计模式相关推荐
- 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》
目录 一.日历.日期.时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Ch ...
- android 从零单排 第一期 按键显示helloworld
啦啦啦- 我是qscqesze 今天开始android的从零单排啦啦啦- 首先从最简单的开始 要求: 程序运行后,单击屏幕上的按键后可以显示一句话,如"Hello World!" ...
- 【Android从零单排系列一】《Android系统发展史》
目录 前言 一.Android 创始人 二.Android 发展历程 三.Android各版本发布时间及特性 1.AndroidBeta:阿童木 2.Android 1.0:发条机器人 3.Andro ...
- Android从零单排之免费短信验证
转载请注明住处:http://blog.csdn.net/crazy1235/article/details/41912003 介绍 短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息 ...
- Android从零单排 004 地下工作者Service -配置和使用
Service 服务 Serivce Tip : 四大组件之一 , 后台, 耗时操作 服务是基于android 提供的四大组件之一,地位也是相当之高,主要作为activity不显示的情况,做一些后 ...
- android从零单排之批量删除手机通讯录
上篇文章,我转载了一片网上关于对android系统通讯录的CRUD操作的经典文章,当时用的lg四太子那款手机进行的测试,完全没问题,但是后来发现,其在删除手机通讯录那块有点问题,因为我后来在其他手机, ...
- Android从零单排之Adapter及其子类
Adapter--适配器,相信大家在开发中少不了用这个类或者它的子类.本人也在很多地方都用到,所以在这里总结一下. Adapter扮演了一个桥梁的角色,把AdapterView和数据源板绑定一起.Ad ...
- Android常见设计模式——代理模式(Proxy Pattern)(二)
文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...
- Spring5从零单排学习笔记【非常详细】
前排 自学网课笔记整理,初次发博,有错的地方各位多多指教. Spring5从零单排学习笔记 文章目录 前排 Spring5从零单排学习笔记 一.Spring5框架概述 二.★IOC容器(Inversi ...
最新文章
- AI大佬“互怼”:Bengio和Gary Marcus隔空对谈深度学习发展现状
- PageHelper 在 Spring Boot + MyBatis 中合理且规范的使用方法
- ubuntu pip更新_Cubietruck开发板折腾002:安装Python管理工具pip
- 华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...
- python查找文件是否存在_python脚本查找文件是否存在的方法
- -bash: mysql_upgrade: command not found
- 2016 中国大数据技术大会 相关资料
- 初入职场的程序员,不想被时代淘汰?那你必须迈过这个坎!
- php 限定字符长度,php-限制字符串长度
- 1、试卷名称2013年下半年系统集成项目管理工程师真题
- GIS空间分析 栅格数据分析3 可达性分析
- 制作游戏3D模型都有哪些步骤流程
- Unity自定义创建脚本模板菜单
- namespace is terminated
- python代码雨_教你用200行Python代码“换脸”
- 【算法分析】回溯法解数独(九宫格)算法
- 自动化成本高?那么如何获得最高的投资回报呢?
- 2022.11.27 第10次周报
- 如何用html5实现网页聊天,HTML5 WebSocket实现点对点聊天的示例代码
- 设计模式详解:抽象工厂模式