回调&观察者模式

两者都是用了实现接口的方式,谈谈异同

回调接口

重点是理解,哪里定义方法,哪里调用方法,以及接口实现

A向B提问,B思考一会儿,得到答案通知A

A中

1. 设置给B set 回调接口,
2. 定义回调方法,
3. 给B set问题,回调方法的参数中有问题答案
4. 调用B 解决问题的方法

B中:

1. 定义思考过程,即解决问题的方法,在解决方法中调用回调方法。
2. 定义一些set 方法

回调接口:

1. 定义接口
2. 方法声明
	
	public class A {
    private static final String TAG = "A";
    public static void main(String[] args){
        B b = new B();
        b.setQusetion("1+1等于几?");

        b.setCallBack(new Callback() {
            @Override
            public void callbackByTel(String answer) {
                Log.e(TAG, "callbackByTel: 答案是:"+answer );
            }
        });
        b.handleQustion();//也可以这里传入问题,无参方便理解

    	}
	}
//==========================================================

	public class B {
	
	    private Callback callback;
	    private String question;
	
	    public void setQusetion(String qusetion) {
	        this.question = qusetion;
	    }
	
	    public void setCallBack(Callback callback) {
	        this.callback = callback;
	    }
	
	    public void handleQustion() {
	        new Thread() {
	            @Override
	            public void run() {
	                for (int i = 1; i < 10; i++) {
	                    try {
	                        sleep(1000);
	                    } catch (InterruptedException e) {
	                        e.printStackTrace();
	                    }
	                }
	                callback.callbackByTel("答案是2!!!");
	
	            }
	        }.start();
	    }
	}

//===========================================

	interface Callback {
    	void callbackByTel(String answer);
	}
	

观察者模式

  1. 定义被观察者接口,声明方法 register(Observer),removeObserver(Observer),notifyObserver
  2. 定义观察者接口,生命方法 ,update(str)
  3. 被观察者实现接口,定义方法
  4. 观察者实现接口,定义方法
  5. 测试类中调用

	/**
	 * 抽象被观察者接口,声明了添加,删除,通知观察者方法
	 * 专题接口,所有主题必须实现此接口
	 * @date 2018/8/3
	 */

	public interface Observerable{
	    void registerObserver(Observer observer);
	    void removeObserver(Observer observer);
	    void notifyObservers();
	}
	//=============================================================
	/**
	 * 定义一个抽象观察者接口,当被观察者调用notifyObserver()方法时,观察者update会被回调
	 * 所有观察者需要实现此接口
	 *
	 * @date 2018/8/3
	 */
	
	public interface Observer {
	    void update(String msg);
	}

	//================================================================
	
	/**
	 * 定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,
	 * 同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可
	 * 3D服务号的实现类
	 *
	 * @date 2018/8/3
	 */
	
	public class WechatServer implements Observerable {
	
	    /**
	     * 注意到这个List集合的泛型参数为Observer接口,
	     * 设计原则:面向接口编程而不是面向实现编程
	     */
	    private ArrayList<Observer> observers = new ArrayList<>();
	
	    public void publishMsg(String msg) {
	        this.msg = msg;
	        notifyObservers();
	    }
	
	    String msg;
	
	
	    @Override
	    public void registerObserver(Observer observer) {
	        observers.add(observer);
	    }
	
	    @Override
	    public void removeObserver(Observer observer) {
	        int index = observers.indexOf(observer);
	        if (index > 0) {
	            observers.remove(index);
	        }
	    }
	
	    @Override
	    public void notifyObservers() {
	        for (Observer observer : observers) {
	            observer.update(msg);
	        }
	    }
	
	}
	
	
	//=====================================================
			/**
			 * 定义被观察者
			 * 模拟第一个使用者
			 * @date 2018/8/3
			 */
			public class ObserverUser1 implements Observer {
			    public static final String TAG=ObserverUser1.class.getSimpleName();
			
			    public ObserverUser1(Observerable observerable) {
			        observerable.registerObserver(this);
			
			    }
			
			    @Override
			    public void update(String msg) {
			        Log.e(TAG, "得到3D号码: "+msg+" ,我要记下来" );
			    }
			}
			//======================================
			/**
			 * Demo class
			 *
			 * @author pengjingang
			 * @date 2018/8/3
			 */
			public class ObserverUser2 implements Observer {
			
			    public static final String TAG = ObserverUser2.class.getSimpleName();
			
			    public ObserverUser2(Observerable observerable) {
			        observerable.registerObserver(this);//也可以定义到外面,由observable子类对象调用
			    }
			
			    @Override
			    public void update(String msg) {
			        Log.e(TAG, "得到3D号码: " + msg + "  ,我要告诉舍友们");
			    }
			}
			//======================================

联系

  • 观察者模式,一个被观察者,多个观察者或者说 一个通知者,多个接收者
  • 回调接口,可以看作特殊的观察者,即 询问着为观察者,回答者为被观察着
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值