Android常用设计模式(二)
Android常用设计模式之观察者模式
观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景:
用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除用户;然后用户观察报社,
当有了新的报纸,报社就告诉用户并发送报纸的用户的手上,这其中,用户是观察者,报社是被观察者,一旦报纸有了新的
(数据发生改变)报社就会通知用户;
代码示例如下:
首先我们根据用户的共同特征,都要接受报纸,来提取出来一个公共的用户接口
/**
* 用户接口
*
* @author jiaocg
*
*/
public interface Users {
public void receive();//接受报纸方法
}
然后每一个用户都去实现这个接口,这里我们创建连个用户
用户A
/**
* 用户A
*
* @author jiaocg
*
*/
public class UserA implements Users { @Override
public void receive() { System.out.println("用户A收到了"); } }
用户B
/**
* 用户B
*
* @author jiaocg
*
*/
public class UserB implements Users { @Override
public void receive() { System.out.println("用户B收到了"); } }
然后我们创建被观察者 报社类 主要负责添加删除用户 发报纸
/**
* 被观察者 报纸
*
* @author jiaocg
*
*/
public class NewSpaper {
private List<Users> users = new ArrayList<Users>(); // 订报
public void addUser(Users user) {
users.add(user); } // 退订
public void removeUser(Users user) {
users.remove(user);
} // 发报
public void sendNewSpaper() {
for (Users user : users) {
user.receive();
}
} }
使用方式:
NewSpaper newSpaper = new NewSpaper();
newSpaper.addUser(new UserA());
newSpaper.addUser(new UserB()); // 满足你的条件后 开始发报
newSpaper.sendNewSpaper();
代理模式
代理模式顾名思义就是自己不想做什么事情,让别人代表自己去做。比如我们要租房子,我们自己跑来跑去去找肯定很麻烦
我们可以直接去找中介,让中介去帮我们选合适的房子,中介找到合适的房子后再告诉我就可以了;
这里面就涉及到两个角色:代理者和被代理者,我是被代理者,中介是代理者;然后我和中介之间需要提取出来一个共同的抽象
类,我和中介都继承这个抽象类;这样任何使用我的地方,都可以使用中介来代替;中介内部含有对我的引用,从而可以在任何时候
对我进行操作;
在代理模式中的角色:
● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
● 目标对象角色:定义了代理对象所代表的目标对象。
● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,
以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
示例代码如下:
抽象对象角色
/**
* 代理和被代理对象 提取出来的抽象类
* @author jiaocg
*
*/
public abstract class MyAndProxyObject { public abstract void doSomething();
}
目标对象角色
/**
* 被代理对象
*
* @author jiaocg
*
*/
public class MyObject extends MyAndProxyObject { @Override
public void doSomething() { System.out.println("我是本尊"); } }
代理对象角色
/**
* 代理对象
*
* @author jiaocg
*
*/
public class ProxyObject extends MyAndProxyObject { MyObject myObject = new MyObject(); @Override
public void doSomething() { beforeDoSomething();
myObject.doSomething();
afterDoSomething(); } private void afterDoSomething() { System.out.println("代理之前的操作"); } private void beforeDoSomething() {
System.out.println("代理之后的操作"); } }
使用操作
ProxyObject proxyObject = new ProxyObject(); proxyObject.doSomething();
直接实例化代理对象,我们队代理做的操作,实际上都会影响到目标对象;
Android常用设计模式(二)的更多相关文章
- Android常用设计模式(一)
java有23中设计模式,Android中也用到了很多的设计模式,本篇就来介绍Android中常用的几种设计模式 一.普通工厂设计模式 普通工厂设计模式,就是创建一个工厂类负责创建对象 ,用户根据需求 ...
- java常用设计模式二:工厂模式
1.简单工厂模式(静态工厂方法模式) 抽象实例: public interface People { void talk(); } 具体实例: public class Doctor implemen ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- 代码重构 & 常用设计模式
代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1 新建一个方法 ...
- Android开源项目(二)
第二部分 工具库 主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过 ...
- Android 常用 adb 命令
查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...
- 【风马一族_Android】第4章Android常用基本控件
第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...
- Android常用组件
UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...
- Android常用组件【转】
UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...
随机推荐
- JavaScript基础插曲—获取标签,插入元素,操作样式
Js基础 1:document.write() 这个是动态创建元素内容,利用js.这个可以利用js来创建元素,文本,标签等,document.write()与document.writeln()的区别 ...
- MVC 4.0 学习中遇到的bug
1.0 _ViewStart.cshtml _ViewStart.cshtml 里面的如果写了 <script src="/Scripts/jquery-1.8.2.js" ...
- 【C#】递归搜索指定目录下的指定项目(文件或目录)
---------------更新:201411201121--------------- 主要更新说明:将原bool recurse参数改为int depth,这样可以指定递归深度,而不是笼统的是否 ...
- 在Excel中使用频率最高的函数的功能和使用方法
在Excel中使用频率最高的函数的功能和使用方法,按字母排序: 1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝 ...
- Ubuntu密码错误的问题
安装了一个Ubuntu,启动以后进入终端,想su root,提示输入密码,输入了很多次密码(我的用户密码和root密码是一样的),总是Login incorrect. 后来输入了用户名,提示输入密码, ...
- Struts 2.0全面分析
Struts 2.0 struts 1---前端控制+应用控制+命令模式 webwork ---控制器+拦截器+代理 Struts 2.0 继承了WebWork的设计理念,并没有继承struts 1, ...
- Scalaz(7)- typeclass:Applicative-idomatic function application
Applicative,正如它的名称所示,就是FP模式的函数施用(function application).我们在前面的讨论中不断提到FP模式的操作一般都在管道里进行的,因为FP的变量表达形式是这样 ...
- ErrorExecution failed for task 'apptransformClassesWithDexForDebug'
[原因]: 在工程中既有本地的lib.jar文件,又有compile链接.
- 最短的数字判断代码 js
转自 http://www.cnblogs.com/snandy/p/3590186.html 我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是nu ...
- C# 如何在Excel 动态生成PivotTable
Excel 中的透视表对于数据分析来说,非常的方便,而且很多业务人员对于Excel的操作也是非常熟悉的,因此用Excel作为分析数据的界面,不失为一种很好的选择.那么如何用C#从数据库中抓取数据,并在 ...