• Android常用设计模式(二)


    Android常用设计模式之观察者模式

    观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景:

    用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除用户;然后用户观察报社,

    当有了新的报纸,报社就告诉用户并发送报纸的用户的手上,这其中,用户是观察者,报社是被观察者,一旦报纸有了新的

    (数据发生改变)报社就会通知用户;

    代码示例如下:

    首先我们根据用户的共同特征,都要接受报纸,来提取出来一个公共的用户接口

    1 /**
    2  * 用户接口
    3  * 
    4  * @author jiaocg
    5  * 
    6  */
    7 public interface Users {
    8     public void receive();//接受报纸方法
    9 }

    然后每一个用户都去实现这个接口,这里我们创建连个用户

    用户A

     1 /**
     2  * 用户A
     3  * 
     4  * @author jiaocg
     5  * 
     6  */
     7 public class UserA implements Users {
     8 
     9     @Override
    10     public void receive() {
    11 
    12         System.out.println("用户A收到了");
    13 
    14     }
    15 
    16 }

    用户B

     1 /**
     2  * 用户B
     3  * 
     4  * @author jiaocg
     5  * 
     6  */
     7 public class UserB implements Users {
     8 
     9     @Override
    10     public void receive() {
    11 
    12         System.out.println("用户B收到了");
    13 
    14     }
    15 
    16 }

    然后我们创建被观察者  报社类 主要负责添加删除用户 发报纸

     1 /**
     2  * 被观察者 报纸
     3  * 
     4  * @author jiaocg
     5  * 
     6  */
     7 public class NewSpaper {
     8     private List<Users> users = new ArrayList<Users>();
     9 
    10     // 订报
    11     public void addUser(Users user) {
    12         users.add(user);
    13 
    14     }
    15 
    16     // 退订
    17     public void removeUser(Users user) {
    18         users.remove(user);
    19     }
    20 
    21     // 发报
    22     public void sendNewSpaper() {
    23         for (Users user : users) {
    24             user.receive();
    25         }
    26     }
    27 
    28 }

    使用方式:

    1 NewSpaper newSpaper = new NewSpaper();
    2 newSpaper.addUser(new UserA());
    3 newSpaper.addUser(new UserB());
    4 
    5 // 满足你的条件后 开始发报
    6 newSpaper.sendNewSpaper();

    代理模式

    代理模式顾名思义就是自己不想做什么事情,让别人代表自己去做。比如我们要租房子,我们自己跑来跑去去找肯定很麻烦

    我们可以直接去找中介,让中介去帮我们选合适的房子,中介找到合适的房子后再告诉我就可以了;

    这里面就涉及到两个角色:代理者和被代理者,我是被代理者,中介是代理者;然后我和中介之间需要提取出来一个共同的抽象

    类,我和中介都继承这个抽象类;这样任何使用我的地方,都可以使用中介来代替;中介内部含有对我的引用,从而可以在任何时候

    对我进行操作;

    在代理模式中的角色:

      ●  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。

      ●  目标对象角色:定义了代理对象所代表的目标对象。

      ●  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,

    以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

    示例代码如下:

    抽象对象角色

    1 /**
    2  * 代理和被代理对象 提取出来的抽象类
    3  * @author jiaocg
    4  *
    5  */
    6 public abstract class MyAndProxyObject {
    7 
    8     public abstract void doSomething();
    9 }

    目标对象角色

     1 /**
     2  * 被代理对象
     3  * 
     4  * @author jiaocg
     5  * 
     6  */
     7 public class MyObject extends MyAndProxyObject {
     8 
     9     @Override
    10     public void doSomething() {
    11 
    12         System.out.println("我是本尊");
    13 
    14     }
    15 
    16 }

    代理对象角色

     1 /**
     2  * 代理对象
     3  * 
     4  * @author jiaocg
     5  * 
     6  */
     7 public class ProxyObject extends MyAndProxyObject {
     8 
     9     MyObject myObject = new MyObject();
    10 
    11     @Override
    12     public void doSomething() {
    13 
    14         beforeDoSomething();
    15         myObject.doSomething();
    16         afterDoSomething();
    17 
    18     }
    19 
    20     private void afterDoSomething() {
    21 
    22         System.out.println("代理之前的操作");
    23 
    24     }
    25 
    26     private void beforeDoSomething() {
    27         System.out.println("代理之后的操作");
    28 
    29     }
    30 
    31 }

    使用操作

    1 ProxyObject proxyObject = new ProxyObject();
    2 
    3 proxyObject.doSomething();

    直接实例化代理对象,我们队代理做的操作,实际上都会影响到目标对象;

  • 相关阅读:
    区分replace()和replaceAll()
    error:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    关于设计SQL表的一些问题
    SQL语句的学习理解
    error:安装手电筒程序后在打开程序后报错:你的camera flashlight正在被其他程序占据
    Error:Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package name 'com.fortythree.sos.flashlight'
    Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/adp;
    Android Studio 封装的类的继承
    Android SDK安装
    MongoDB探索之路(二)——系统设计之CRUD
  • 原文地址:https://www.cnblogs.com/all88/p/5198952.html
Copyright © 2020-2023  润新知