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

发布时间:2011-07-08 15:55:45

观察者模式_OBSERVER_案例详解

1Observer案例

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来封装Watcher

  private List list = new List();

 //并覆盖其方法

 public void add(Watcher watcher){

       list.add(watcer);

 }

 public void remove(Watcher watcher){

list.remove(watcher);

 }

 public void notifyWatcher(Content content){

     for(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}{

    this.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[]){

//实例一个被观察者

     Watched 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) {

this.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.List;

import java.util.List;

/**

 * MSN绝对被观察者类继承了MSN抽象被观察者类

 * @author jiangshide

 *

 */

public class MsnConcreteSubject extends MsnSubject {

private List list = new List();

MainObserver msnObserver = new MsnConcreteObserver();

MainObserver newsObserver = new NewsConcreteObserver();

@Override

void addObserver(MainObserver mainObserver) {

// TODO Auto-generated method stub

if(mainObserver.equals(msnObserver)){

//添加关注MSN消息的人

list.add(msnObserver);

}else if(mainObserver.equals(newsObserver)){

//添加关注NEWS新闻的人

list.add(newsObserver);

}else{

//没有想加入任何关注的人

}

}

@Override

void notifyObservers(MainContent mainContent) {

// TODO Auto-generated method stub

for(MainObserver mainObservers : list){

if(mainObservers.equals(msnObserver)){

mainContent = new MsnContent();

}

}

}

@Override

void removeObserver(MainObserver mainObserver) {

// TODO Auto-generated method stub

if(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 {

@Override

public void updataNotyfy(MainContent mainContent) {

// TODO Auto-generated method stub

}

@Override

void 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 {

@Override

void addObserver(MainObserver mainObserver) {

// TODO Auto-generated method stub

}

@Override

void notifyObservers(MainContent mainContent) {

// TODO Auto-generated method stub

}

@Override

void removeObserver(MainObserver mainObserver) {

// TODO Auto-generated method stub

}

}

package com.jsd.observer.app;

/**

 * NEWS绝对观察者继承了NEWS抽象观察者

 * @author jiangshide

 *

 */

public class NewsConcreteObserver extends NewsObserver {

@Override

public void updataNotyfy(MainContent mainContent) {

// TODO Auto-generated method stub

}

}

好了,上面就是我个人在理解观察者模式后的深入理解,请看代码并能看出结构,希望多提出些介意.....

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

相关推荐