观察者模式_OBSERVER_案例详解

来源:互联网 发布:豫鲁书院 知乎 编辑:程序博客网 时间:2024/06/05 04:39

之前讲过一篇关于单列模式的模式设计讲解,今天就就对观察者模式进行讲解下吧,在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<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){

    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图:

 

 

核心框架代码为:

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.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();
@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
}
}
好了,上面就是我个人在理解观察者模式后的深入理解,请看代码并能看出结构,希望多提出些介意.....

原创粉丝点击