博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式的秘密-观察者模式(四)
阅读量:6979 次
发布时间:2019-06-27

本文共 4348 字,大约阅读时间需要 14 分钟。

区别对待观察者场景问题

两点需求:

第一:黄明女朋友只想接收下雨的天气预报。

第二:黄明老妈,想接收下雨或者下雪的天气预报。

 

解决思路:

情况之一:

如果天气晴天,按照黄明女朋友需要下雨添加,黄明老妈需要下雨或者下雪条件,他俩都不需要通知。

情况二:

如果下雨,则黄明女朋友和老妈都要通知。

情况三:

如果下雪,只通知黄明老妈。

 

代码实例解决场景问题

实例的实现步骤:

1,定义目标的抽象类和观察者的接口

2,实现目标的类和观察者接口

3,进行测试。

第一步:创建目标的抽象类:

package com.WeatherObserverPattern02;import java.util.ArrayList;import java.util.List;public abstract class WeatherSubject {    //保存注册的观察者对象    public List
observers=new ArrayList
(); //attach detach notifyObservers //把订阅天气的人添加到订阅者列表 public void attach(Observer observer) { observers.add(observer); } //删除集合中指定的订阅天气的人 public void detach(Observer observer) { observers.remove(observer); } protected abstract void notifyObservers();}

第二步:创建目标类:在notifyObservers里面,分场景调用update(通知观察者)

package com.WeatherObserverPattern02;import com.WeatherObserverPattern02.WeatherSubject;public class ConcreteWeatherSubject extends WeatherSubject {        //晴天,下雨,下雪    //目标对象状态    private String weatherContent;        public String getWeatherContent() {        return weatherContent;    }    public void setWeatherContent(String weatherContent) {        this.weatherContent = weatherContent;        this.notifyObservers();    }    @Override    protected void notifyObservers()    {        for(Observer observer:observers)        {            //规则:黄明女朋友只需要下雨,老妈既要下雨也要下雪                        //如果天气晴天:            //doNothing            //如果下雨            if("下雪".equals(this.getWeatherContent()))            {                if("黄明的女朋友".equals(observer.getObserverName()))                {                    observer.update(this);                }                if("黄明的老妈".equals(observer.getObserverName()))                {                    observer.update(this);                }            }            //如果下雪            if("下雪".equals(this.getWeatherContent()))            {                if("黄明的老妈".equals(observer.getObserverName()))                {                    observer.update(this);                }            }        }    };}

第三步:创建观察者接口:

package com.WeatherObserverPattern02;//定义一个更新的接口给哪些在目标发生改变的时候被通知的观察者对象调用public interface Observer {    //更新的接口    public void update(WeatherSubject subject);        //设置观察者名称    public void setObserverName(String observerName);        //获取观察者名称    public String getObserverName();}

第四步:创建具体观察者类:

package com.WeatherObserverPattern02;public class ConcreteObserver implements Observer {    //观察者名称    private String observerName;    //天气的内容    private String weatherContent;    //提醒的内容    private String remindThing;        @Override    public void update(WeatherSubject subject) {                weatherContent=((ConcreteWeatherSubject)subject).getWeatherContent();        System.out.println(observerName+"收到了"+weatherContent+","+remindThing);    }    @Override    public void setObserverName(String observerName) {        this.observerName=observerName;    }    @Override    public String getObserverName() {        return this.observerName;    }    public String getWeatherContent() {        return weatherContent;    }    public void setWeatherContent(String weatherContent) {        this.weatherContent = weatherContent;    }    public String getRemaindThing() {        return remindThing;    }    public void setRemindThing(String remindThing) {        this.remindThing = remindThing;    }}

测试:

package com.WeatherObserverPattern02;import com.WeatherObserverPattern02.ConcreteObserver;import com.WeatherObserverPattern02.ConcreteWeatherSubject;//区别对待观察者场景问题public class Client {    public static void main(String[] args) {        //1,创建目标        ConcreteWeatherSubject weather=new ConcreteWeatherSubject();        //2,创建观察者        ConcreteObserver observerGirl=new ConcreteObserver();        observerGirl.setObserverName("黄明的女朋友");        observerGirl.setRemindThing("下雨了,安静呆在家里吧");                ConcreteObserver observerMum=new ConcreteObserver();        observerMum.setObserverName("黄明的老妈");        observerMum.setRemindThing("不管下雨还是下雪都不出门");                //3,注册观察者        weather.attach(observerGirl);        weather.attach(observerMum);        //4,目标发布天气        weather.setWeatherContent("下雨");        weather.setWeatherContent("下雪");        weather.setWeatherContent("晴天");    }}

测试结果:

黄明的女朋友收到了下雪,下雨了,安静呆在家里吧黄明的老妈收到了下雪,不管下雨还是下雪都不出门黄明的老妈收到了下雪,不管下雨还是下雪都不出门

 

转载地址:http://sfjpl.baihongyu.com/

你可能感兴趣的文章
USRP N210实现的整个属性树结构
查看>>
保护模式汇编系列之四 - 段页式内存管理(二)
查看>>
【Scheme归纳】5 数据结构
查看>>
【Java数据结构】链表
查看>>
More Effective C++ 读书笔记六——临时对象
查看>>
Spring的容器内部事件发布
查看>>
mongoDB Indexing Advice
查看>>
跟我学Kafka之NIO通信机制
查看>>
关于版本管理
查看>>
1 Java NIO概述-翻译
查看>>
图像延迟加载 && 列表图顺序加载
查看>>
MySQL 基础架构你不知道的那些事!
查看>>
Vue学习笔记(1)——在页面右上角实现可悬浮/隐藏的系统菜单
查看>>
UITableView占位图的低耦合性设计
查看>>
一个女装小程序的瀑布流实现
查看>>
Docker实现Mariadb分库分表、读写分离
查看>>
Node.js核心内容
查看>>
github克隆本地项目
查看>>
j抽奖
查看>>
GMQ力争为全球区块链数字资产技术应用贡献一份力量
查看>>