标签:
观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了。观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸。
怎么实现呢?考虑接口的应用,以及List容器的使用等。
主题接口,相当于报社 package com.csshu; 主题接口,具有注册观察者和移除观察者方法 public interface mysubject { public void registerObserver(myobserver o); public void removeObserver(myobserver o); } 这里需要提供注册(交钱)和取消(相当于读者不想继续订阅报纸了)这两个方法,没错 这些方法需要在主题(报社)里面实现,而观察者(读者)需要去调用,下面有分享。 观察者接口 package com.csshu; public interface myobserver { public void update(int a,int b,int c); } 这里是观察者1的实现, package com.csshu; public class Observer implements myobserver { @Override public void update(int a, int b, int c) { System.out.println(a+"---one,"+b+"---"+c); } } 第二个观察者, package com.csshu; public class Observer2 implements myobserver { @Override public void update(int a, int b, int c) { System.out.println(a+"---two,"+b+"---"+c); } } 主题对象的实现, package com.csshu; import java.util.ArrayList; import java.util.List; public class Subject implements mysubject{ private List<myobserver> array = new ArrayList<>(); @Override public void registerObserver(myobserver o) { array.add(o); } @Override public void removeObserver(myobserver o) { int index = array.indexOf(o); if (index > -1){ array.remove(index); } } public void notifyDatasetchange(int a ,int b,int c){ for (int i=0;i<array.size();i++){ array.get(i).update(a, b, c); } } } 可以看到,我们实现了两个方法,主要是通过List来实现的,通过notifyDatasetchange方法 来给每个注册的观察者更新在主题中可以传递的数值,这里我们传递a,b,c 最后是main方法, package com.csshu; public class mains { public static void main(String[] args) { Subject sub = new Subject(); Observer o1 = new Observer(); Observer2 o2 = new Observer2(); sub.registerObserver(o1); sub.registerObserver(o2); sub.notifyDatasetchange(1, 2, 3); } } 我们new了一个主题,两个观察者,这里是通过调用主题对象里面的方法注册观察者,当然 可以更含蓄的通过观察者的构造方法传递主题对象的引用,然后再调用其注册方法。 主题用notify来把需要传递的数据传递给观察者。
标签:
原文地址:http://www.cnblogs.com/likeshu/p/4957727.html