观察者模式_OBSERVER_案例详解

观察者模式_OBSERVER_案例详解

1、Observer案例

在23种设计模式中,观察者模式算是模式设计中的皇后,尤其是在我们做软件设计过的过程中所体现的更是立足无穷,再说它好,还不如来个实例不是更简单明了,我就把对其概念上的讲解以注释的方式写在代码注释中,如下所示:

//首先我们需要先定义一个接口为:抽象观察者

public interface Watcher{

 //再定义一个用来获取更新信息接收的方法

 public void updateNotify(Contentcontent);

}

//其次定义一个接口为:抽象被观察者

public interface Watched{

 //在其接口中定义一个用来增加观察者的方法

 public void add(Watcher watcher);

 //再定义一个用来删除观察者权利的方法

 public void remove(Watcher watcher);

 //再定义一个可以实现行为变现并向观察者传输信息的方法

 public void notifyWatcher(Contentcontent);

}

//再次就是定义一个类为:具体观察者并实现其接口抽象观察者

public class ConcreteWatcher implementsWatcher{

 //并覆盖其方法

 public void updateNotify(Contentcontent){

     int id = content.getId();

        String name= content.getName();

    Stringaddress = content.getAddress();

    System.out.println("id:"+id++"/nname:"+name+"/n address:"+address);

 }

}

//最后就是定义一个类为:具体被观察者并实现其抽象接口抽象被观察者

public class ConcreteWatched implementsWatched{

  //定义一个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(Contentcontent){

      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(Stringaddress){

    this.address = address;

 }

 public String getAddress(){

    return address

 }

}

//测试类

public classs Test{

 public static void main(Stringargs[]){

    //实例一个被观察者

      Watched watched = new Watched();

    //实例第一个观察者对被观察者进行观察

        Watcherwatcher1 = new Watcher();

    //实例第二个观察者对被观察者进行观察

    Watcherwatcher2 = new Watcher();

    //实例第三个观察者对被观察者进行观察

    Watcherwatcher3 = new Watcher();

    //加入对其观察

    watched.add(watcher1);

    watched.add(watcher2);

    watched.add(watchre3);

    //当被观察者发生变化时:调用其信息方法 

    Contentcontent = 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(MainObservermainObserver);

abstract void removeObserver(MainObservermainObserver);

abstract void notifyObservers(MainContentMainContent);

public void localNofity(){}

}

package com.jsd.observer.app;

/**

 * 主抽象观察者

 * @author jiangshide

 *

 */

abstract class MainObserver {

abstract void updataNotyfy(MainContentmainContent);

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

abstract void msnNotify();

}

package com.jsd.observer.app;

/**

 * MSN抽象被观察者并继承了主抽象被观察者

 * @author jiangshide

 *

 */

abstract class MsnSubject extendsMainSubject {

}

package com.jsd.observer.app;

/**

 * Msn内容提供者

 * @author jiangshide

 *

 */

public class MsnContent extendsMainContent{

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(StringmsnContent) {

this.msnContent = msnContent;

}

public String getFromResouce() {

return fromResouce;

}

public void setFromResouce(StringfromResouce) {

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

private List<MainObserver> list =new ArrayList<MainObserver>();

MainObserver msnObserver = newMsnConcreteObserver();

MainObserver newsObserver = newNewsConcreteObserver();

@Override

void addObserver(MainObservermainObserver) {

// 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(MainContentmainContent) {

// TODO Auto-generated method stub

for(MainObserver mainObservers : list){

if(mainObservers.equals(msnObserver)){

mainContent = new MsnContent();

}

}

}

@Override

void removeObserver(MainObservermainObserver) {

// TODO Auto-generated method stub

if(mainObserver.equals(msnObserver)){

//删除此刻有关注MSN消息的人

list.remove(msnObserver);

}elseif(mainObserver.equals(newsObserver)){

//删除此刻有关注NEW新闻的人

list.remove(newsObserver);

}

}

}

package com.jsd.observer.app;

/**

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

 * @author jiangshide

 *

 */

public class MsnConcreteObserver extendsMsnObserver {

@Override

public void updataNotyfy(MainContentmainContent) {

// TODO Auto-generated method stub

}

@Override

void msnNotify() {

// TODO Auto-generated method stub

}

}

package com.jsd.observer.app;

/**

 * NEWS抽象观察者并继承了主抽象观察者

 * @author jiangshide

 *

 */

abstract class NewsObserver extendsMainObserver {

}

package com.jsd.observer.app;

/**

 * NEWS抽象被观察者继承了主抽象被观察者

 * @author jiangshide

 *

 */

abstract class NewsSubject extendsMainSubject{

}

package com.jsd.observer.app;

/**

 * NEWS内容提供者并继承了主内容信息

 * @author jiangshide

 *

 */

public class NewsContent extendsMainContent{

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(StringnewsContent) {

this.newsContent = newsContent;

}

public String getFromResource() {

return fromResource;

}

public void setFromResource(StringfromResource) {

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

@Override

void addObserver(MainObservermainObserver) {

// TODO Auto-generated method stub

}

@Override

void notifyObservers(MainContentmainContent) {

// TODO Auto-generated method stub

}

@Override

void removeObserver(MainObservermainObserver) {

// TODO Auto-generated method stub

}

}

package com.jsd.observer.app;

/**

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

 * @author jiangshide

 *

 */

public class NewsConcreteObserver extendsNewsObserver {

@Override

public void updataNotyfy(MainContentmainContent) {

// TODO Auto-generated method stub

}

}

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值