当前位置:文档之家› android Observer(观察者模式)_案例祥解

android Observer(观察者模式)_案例祥解

观察者模式_OBSERVER_案例详解1、Observer案例在23种设计模式中,观察者模式算是模式设计中的皇后,尤其是在我们做软件设计过的过程中所体现的更是立足无穷,再说它好,还不如来个实例不是更简单明了,我就把对其概念上的讲解以注释的方式写在代码注释中,如下所示://首先我们需要先定义一个接口为:抽象观察者public interface Watcher{//再定义一个用来获取更新信息接收的方法public void updateNotify(Content content);}//其次定义一个接口为:抽象被观察者public interface Watched{//在其接口中定义一个用来增加观察者的方法public void add(Watcher watcher);//再定义一个用来删除观察者权利的方法public void remove(Watcher watcher);//再定义一个可以实现行为变现并向观察者传输信息的方法public void notifyWatcher(Content content);}//再次就是定义一个类为:具体观察者并实现其接口抽象观察者public class ConcreteWatcher implements Watcher{//并覆盖其方法public void updateNotify(Content content){int id = content.getId();String name = content.getName();String address = content.getAddress();System.out.println("id:"+id++"/n name:"+name+"/n address:"+address); }}//最后就是定义一个类为:具体被观察者并实现其抽象接口抽象被观察者public class ConcreteWatched implements Watched{//定义一个List来封装Watcherprivate List<Watcher> list = new ArrayList<Watcher>();//并覆盖其方法public void add(Watcher watcher){list.add(watcer);}public void remove(Watcher watcher){list.remove(watcher);}public void notifyWatcher(Content content){f or(Watcher watcher : list){watcher.updateWatcher(content);}}}//以面向对象的方式来操作,需要定义一个实体来进行操作public class Content{private int id;private String name;private String address;public void setId(int id){this.id = id;}public int getId(){return id;}public void setName{String name}{ = name;}public String getName(){return name;}public void setAddress(String address){ this.address = address;}public String getAddress(){return address}}//测试类public classs Test{public static void main(String args[]){//实例一个被观察者W atched watched = new Watched();//实例第一个观察者对被观察者进行观察 Watcher watcher1 = new Watcher();//实例第二个观察者对被观察者进行观察Watcher watcher2 = new Watcher();//实例第三个观察者对被观察者进行观察Watcher watcher3 = new Watcher();//加入对其观察watched.add(watcher1);watched.add(watcher2);watched.add(watchre3);//当被观察者发生变化时:调用其信息方法Content content = new Content();content.setId("0001");content.setName("jiangshide");content.setAddress("beijing");watched.notifyWatchers(content);//被观察者可以调用删除方法watched.remove(watchr2);content.setName="litian";watched.notifyWatchers(content);}}好了,以上就是一个完整的对观察者模式设计的核心代码体现,由上面可以知,观察者与被观察者是一个多对一的关系,也就是一个被观察者可同时被多个观察者所共同进行关注,当,被观察者更新时,同时对其观察者会自动更新其信息,为此我又深入的理解并构建了一个UML图:2、核心框架代码:package com.jsd.observer.app;/*** 主抽象被观察者* @author jiangshide**/abstract class MainSubject {abstract void addObserver(MainObserver mainObserver);abstract void removeObserver(MainObserver mainObserver);abstract void notifyObservers(MainContent MainContent);public void localNofity(){}}package com.jsd.observer.app;/*** 主抽象观察者* @author jiangshide**/abstract class MainObserver {abstract void updataNotyfy(MainContent mainContent); public void localNotify(){}}package com.jsd.observer.app;/*** 主内容提供支持* @author jiangshide**/public class MainContent {private int Id;private String name;public int getId() {return Id;}public void setId(int id) {Id = id;}public String getName() {return name;}public void setName(String name) { = name;}}package com.jsd.observer.app;/*** MSN抽象观察者类并继承主抽象观察者* @author jiangshide**/abstract class MsnObserver extends MainObserver { abstract void msnNotify();}package com.jsd.observer.app;/*** MSN抽象被观察者并继承了主抽象被观察者* @author jiangshide**/abstract class MsnSubject extends MainSubject { }package com.jsd.observer.app;/*** Msn内容提供者* @author jiangshide**/public class MsnContent extends MainContent{ private int localId;private String localName;private String msnContent;private String fromResouce;private String fromTime;public int getLocalId() {return localId;}public void setLocalId(int localId) {this.localId = localId;}public String getLocalName() {return localName;}public void setLocalName(String localName) { this.localName = localName;}public String getMsnContent() {return msnContent;}public void setMsnContent(String msnContent) { this.msnContent = msnContent;}public String getFromResouce() {return fromResouce;}public void setFromResouce(String fromResouce) {this.fromResouce = fromResouce;}public String getFromTime() {return fromTime;}public void setFromTime(String fromTime) {this.fromTime = fromTime;}}package com.jsd.observer.app;import java.util.ArrayList;import java.util.List;/*** MSN绝对被观察者类继承了MSN抽象被观察者类* @author jiangshide**/public class MsnConcreteSubject extends MsnSubject {private List<MainObserver> list = new ArrayList<MainObserver>(); MainObserver msnObserver = new MsnConcreteObserver(); MainObserver newsObserver = new NewsConcreteObserver();@Overridevoid addObserver(MainObserver mainObserver) {// TODO Auto-generated method stubif(mainObserver.equals(msnObserver)){//添加关注MSN消息的人list.add(msnObserver);}else if(mainObserver.equals(newsObserver)){//添加关注NEWS新闻的人list.add(newsObserver);}else{//没有想加入任何关注的人}}@Overridevoid notifyObservers(MainContent mainContent) { // TODO Auto-generated method stubfor(MainObserver mainObservers : list){if(mainObservers.equals(msnObserver)){ mainContent = new MsnContent();}}}@Overridevoid removeObserver(MainObserver mainObserver) { // TODO Auto-generated method stubif(mainObserver.equals(msnObserver)){//删除此刻有关注MSN消息的人list.remove(msnObserver);}else if(mainObserver.equals(newsObserver)){//删除此刻有关注NEW新闻的人list.remove(newsObserver);}}}package com.jsd.observer.app;/*** MSN绝对观察者继承了MSN抽象观察者* @author jiangshide**/public class MsnConcreteObserver extends MsnObserver { @Overridepublic void updataNotyfy(MainContent mainContent) {// TODO Auto-generated method stub}@Overridevoid msnNotify() {// TODO Auto-generated method stub}}package com.jsd.observer.app;/*** NEWS抽象观察者并继承了主抽象观察者* @author jiangshide**/abstract class NewsObserver extends MainObserver { }package com.jsd.observer.app;/*** NEWS抽象被观察者继承了主抽象被观察者* @author jiangshide**/abstract class NewsSubject extends MainSubject{}package com.jsd.observer.app;/*** NEWS内容提供者并继承了主内容信息* @author jiangshide**/public class NewsContent extends MainContent{ private int localId;private String localName;private String newsContent;private String fromResource;private String linkWeb;public int getLocalId() {return localId;}public void setLocalId(int localId) {this.localId = localId;}public String getLocalName() {return localName;}public void setLocalName(String localName) {this.localName = localName;}public String getNewsContent() {return newsContent;}public void setNewsContent(String newsContent) { this.newsContent = newsContent;}public String getFromResource() {return fromResource;}public void setFromResource(String fromResource) { this.fromResource = fromResource;}public String getLinkWeb() {return linkWeb;}public void setLinkWeb(String linkWeb) {this.linkWeb = linkWeb;}}package com.jsd.observer.app;/*** NEWS绝对被观察者继承了NEWS抽象被观察者* @author jiangshide**/public class NewsConcreteSubject extends NewsSubject { @Overridevoid addObserver(MainObserver mainObserver) {// TODO Auto-generated method stub}@Overridevoid notifyObservers(MainContent mainContent) {// TODO Auto-generated method stub}@Overridevoid removeObserver(MainObserver mainObserver) {// TODO Auto-generated method stub}}package com.jsd.observer.app;/*** NEWS绝对观察者继承了NEWS抽象观察者* @author jiangshide**/public class NewsConcreteObserver extends NewsObserver {@Overridepublic void updataNotyfy(MainContent mainContent) {// TODO Auto-generated method stub}}好了,上面就是我个人在理解观察者模式后的深入理解,请看代码并能看出结构,希望多提出些介意.....。

相关主题