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常用设计模式(二)的更多相关文章

  1. Android常用设计模式(一)

    java有23中设计模式,Android中也用到了很多的设计模式,本篇就来介绍Android中常用的几种设计模式 一.普通工厂设计模式 普通工厂设计模式,就是创建一个工厂类负责创建对象 ,用户根据需求 ...

  2. java常用设计模式二:工厂模式

    1.简单工厂模式(静态工厂方法模式) 抽象实例: public interface People { void talk(); } 具体实例: public class Doctor implemen ...

  3. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  4. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  5. Android开源项目(二)

    第二部分 工具库 主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过 ...

  6. Android 常用 adb 命令

    查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...

  7. 【风马一族_Android】第4章Android常用基本控件

    第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...

  8. Android常用组件

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  9. Android常用组件【转】

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

随机推荐

  1. 完美且精准的 IE10- 版本检测。

    通过动态的写入条件注释的方式,来判断当前的ie浏览器的版本,优点是,对比userAgent字符匹配,要精准很多,应该说是100%正确,缺点就是要通过JS写入条件注释,拖慢页面的加载速度. 如果对于只判 ...

  2. ios开发入门资料整理

    说到 iOS 开发,自己学得也很浅.不过至少独立一人完成了一个应用的开发到 App Store 上线整个过程.既然有人让我说些推荐和建议,就分享一下. 首先建议阅读 Start Developing ...

  3. asp.net中Ajax控件的用途(一)

    1,UpdatePanel控件,用户更新部分内容,示例 放入一个Label和一个Button,单击按钮,label显示当前时间. 2,ScriptManagerProxy控件,每个页面只能有一个Scr ...

  4. Linux移植的一般过程

    前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage, ...

  5. C# redis使用之ServiceStack

    需要注意的是:ServiceStack.Redis 中GetClient()方法,只能拿到Master redis中获取连接,而拿不到slave 的readonly连接.这样 slave起到了冗余备份 ...

  6. Lesson: The "Hello World!" Application

    Lesson: The "Hello World!" Application The sections listed below provide detailed instruct ...

  7. js操纵css更改加载图片大小

  8. jsp输出所有请求头的名称

    Enumeration headernames=request.getHeaderNames(); while(headernames.hasMoreElements()){ String heade ...

  9. Java并发编程:Timer和TimerTask(转载)

    Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...

  10. 实用的Scala泛函编程

    既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台P ...