设计模式之——观察者模式
程序员文章站
2022-07-13 11:10:39
...
原摘取至百度百科
简介:
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
实现方式:
观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。
原理:
事件,也就是观察者与被观察者解耦,一定程度上分离开来(本质上是针对接口的编程,而不是针对实现的编程)
[img]
[/img]
实现过程:
注册——通知——撤销注册
如图:
[img]
[/img]
观察者:
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
使用场景:
同一个发生源,需要针对不同事件类型做出不同的判断处理。
同一个发生源,同一种事件类型,需要不同的处理方式。
简介:
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
实现方式:
观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。
原理:
事件,也就是观察者与被观察者解耦,一定程度上分离开来(本质上是针对接口的编程,而不是针对实现的编程)
[img]
[/img]
实现过程:
注册——通知——撤销注册
如图:
[img]
[/img]
观察者:
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察:
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察:
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
使用场景:
同一个发生源,需要针对不同事件类型做出不同的判断处理。
同一个发生源,同一种事件类型,需要不同的处理方式。
//观察者,需要用到观察者模式的类需实现此接口 public interface Observer{ void update(Object...objs); } //被观察者(一个抽象类,方便扩展) public abstract class Observable{ public final ArrayList<Class<?>> obserList = new ArrayList<Class<?>>(); /**AttachObserver(通过实例注册观察者) *<b>Notice:</b>obcan'tbenull,oritwillthrowNullPointerException **/ public<T> void registerObserver(T ob){ if(ob==null) throw new NullPointerException(); this.registerObserver(ob.getClass()); } /** *AttachObserver(通过Class注册观察者) *@paramcls */ public void registerObserver(Class<?> cls){ if(cls==null) throw new NullPointerException(); synchronized(obserList){ if(!obserList.contains(cls)){ obserList.add(cls); } } } /**UnattachObserver(注销观察者) *<b>Notice:</b> *<b>ItreverseswithattachObserver()method</b> **/ public<T>void unRegisterObserver(Tob){ if(ob==null) throw new NullPointerException(); this.unRegisterObserver(ob.getClass()); } /**UnattachObserver(注销观察者,有时候在未获取到实例使用) *<b>Notice:</b> *<b>ItreverseswithattachObserver()method</b> **/ public void unRegisterObserver(Class<?>cls){ if(cls==null) throw new NullPointerException(); synchronized(obserList){ Iterator<Class<?>>iterator=obserList.iterator(); while(iterator.hasNext()){ if(iterator.next().getName().equals(cls.getName())){ iterator.remove(); break; } } } } /**detachallobservers*/ public void unRegisterAll(){ synchronized(obserList){ obserList.clear(); } } /**Ruturnthesizeofobservers*/ public int countObservers(){ synchronized(obserList){ returnobserList.size(); } } /** *notify all observer(通知所有观察者,在子类中实现) *@paramobjs */ public abstract void notifyObservers(Object... objs); /** *notify one certain observer(通知某一个确定的观察者) *@paramcls *@paramobjs */ public abstract void notifyObserver(Class<?> cls, Object... objs); /** *notifyonecertainobserver *@paramcls *@paramobjs */ public abstract<T> void notifyObserver(T t, Object... objs); } //目标被观察者 public class ConcreteObservable extends Observable{ private static ConcreteObservableinstance = null; private ConcreteObservable(){}; public static synchronized ConcreteObservablegetInstance(){ if(instance == null){ instance=newConcreteObservable(); } returninstance; } @Override public <T> void notifyObserver(T t, Object... objs){ if(t == null) throw new NullPointerException(); this.notifyObserver(t.getClass(), objs); } @Override public void notifyObservers(Object... objs){ for(Class<?>cls : obserList){ this.notifyObserver(cls, objs); } } //通过java反射机制实现调用 @Override public void notifyObserver(Class<?>cls, Object...objs){ if(cls == null) throw new NullPointerException(); Method[] methods = cls.getDeclaredMethods(); for(Method method : methods){ if(method.getName().equals("update")){ try{ method.invoke(cls,objs); break; }catch(IllegalArgumentException e){ e.printStackTrace(); }catch(IllegalAccessException e){ e.printStackTrace(); }catch(InvocationTargetException e){ e.printStackTrace(); } } } } } //使用(实现Observer接口) public class Text extends Activity implements Observer{ publicvoidonCreate(...){ ConcreteObservable.getInstance().registerObserver(Text.class); .... } //实现接口处理 publicvoidupdate(Object...objs){ //做操作,比如更新数据,更新UI等 } }
上一篇: 设计模式之——抽象工厂模式
下一篇: JAVA自定义注解(一)