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. 【原创】Kakfa utils源代码分析(一)

    Kafka.utils,顾名思义,就是一个工具套件包,里面的类封装了很多常见的功能实现——说到这里,笔者有一个感触:当初为了阅读Kafka源代码而学习了Scala语言,本以为Kafka的实现会用到很多 ...

  2. javascript常用判断写法

    js验证表单大全,用JS控制表单提交 ,javascript提交表单 目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长度限制 2.:js判断汉字.判断是 ...

  3. js设置和读取cookie

    /*path参数:表示cookie所在的目录,.net默认为/(根目录).在同一个服务器上有目录如下:/test/,/test/aa/,/test /bb/,现设一个cookie1的path为/tes ...

  4. MySQL建表规范与常见问题

    一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储精确 ...

  5. javamail 利用qq邮箱做邮箱服务器,简单小demo

    首先maven: <dependency> <groupId>javax.mail</groupId> <artifactId>mail</art ...

  6. python 函数小实例

    1.判断一个数字是否为素数: import math # -----------------判断一个数是否是素数------------------ def sushu(a): i=1 for i i ...

  7. PHP storm快捷键

    左边文件路径看不到了,按alt+1就出来了 ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 ctrl+q 查看代码注释 ctrl+d 复 ...

  8. mysql Access denied for user root@localhost错误解决方法总结(转)

    mysql Access denied for user root@localhost错误解决方法总结(转) mysql Access denied for user \'root\'@\'local ...

  9. Java经典实例:按字符颠倒字符串

    使用StringBuilder类的reverse()方法来实现. /** * Created by Frank */ public class StringRevChar { public stati ...

  10. java集合-集合大家族

    在编写 Java 程序中,我们最常用的除了八种基本数据类型,String 对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!Java 中集合大家族的成员实在是太丰富了,有常用的 Array ...