0
点赞
收藏
分享

微信扫一扫

观察者模式简单实现

心存浪漫 2022-05-02 阅读 74

实验内容

在这里插入图片描述

实验运行截图

在这里插入图片描述在这里插入图片描述

实验代码

package Observer.homework;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestUse {
    public static void main(String args[]){
        //创建主题
        WeatherService service = WeatherService.instance;
        //添加观察者
        service.addClient(new ClientWeatherServer());
        service.addClient(new ClientTravelServer());
        // 实例化人类王先生
        Person wang = new Person("wang");
        service.addClient(wang);
        //更新主题

        Date nowTime = new Date(System.currentTimeMillis());
        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd");
        String retStrFormatNowDate = sdFormatter.format(nowTime);
        // System.out.println("retStrFormatNowDate:"+retStrFormatNowDate);
        service.updateWeather(new WeatherInfo(retStrFormatNowDate, "晴转大雨","预报日期:明天,天气状况:晴转大雨,台风影响福建﹐最高温度:32。最低温度:20.旅游项目:黄山5日游﹐旅游价格信息:价格: 5000/人."));
        service.updateWeather(new WeatherInfo(retStrFormatNowDate, "暴雨","预报日期:后天,天气状况:台风登陆福建,暴雨﹐最高温度:26,最低温度:19.旅游项目:香港3日游﹐旅游价格信息:价格:9O00/人."));
    }
}


package Observer.homework;
//主题
public interface IWeatherService {
    void addClient(Client client);      //添加观察者
    boolean deleteClient(Client client);//删除观察者
    void notifyClients();               //通知
    void updateWeather(WeatherInfo info);//主题内容更新
}

package Observer.homework;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
//主题,同时使用了枚举实现单例
public enum WeatherService implements IWeatherService{
    instance;
    private LinkedList<WeatherInfo> weatherInfos = new LinkedList<WeatherInfo>();
    private LinkedHashSet<Client> clients = new LinkedHashSet<Client>();    //存放观察者
    //添加观察者
    @Override
    public void addClient(Client client) {
        clients.add(client);
    }
    //删除观察者
    @Override
    public boolean deleteClient(Client client) {
        return clients.remove(client);
    }
    //通知观察者
    @Override
    public void notifyClients() {
        Iterator<Client> iterator = clients.iterator();
        while(iterator.hasNext()){
            iterator.next().getWeather(weatherInfos.peekFirst());
        }
    }
    //更新天气
    @Override
    public void updateWeather(WeatherInfo info) {
        if(weatherInfos.size()>0)
            if(weatherInfos.peekFirst().equals(info)) return;
        weatherInfos.push(info);
        if(clients.size()==0) return;
        notifyClients();
    }
}

package Observer.homework;
//观察者
public interface Client {
    void getWeather(WeatherInfo info);
}


package Observer.homework;

public class ClientTravelServer implements Client {
    private static String name = "旅行社的服务";
    private WeatherInfo info;
    @Override
    public void getWeather(WeatherInfo info) {
        this.info = info;
        dealMsg();
    }
    private void dealMsg(){
        System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"。马上开始推送消息...");
    }
}


package Observer.homework;

public class ClientWeatherServer implements Client {
    private static String name = "气象站的服务";
    private WeatherInfo info;
    @Override
    public void getWeather(WeatherInfo info) {
        this.info = info;
        dealMsg();
    }
    private void dealMsg(){
        System.out.println(name + "收到最新天气:time="+info.getTime()+"msg="+info.getWeather()+"info="+info.getInfo()+",马上开始推送消息...");
    }
}


package Observer.homework;

// 人类
public class Person  implements Client {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public void getWeather(WeatherInfo info) {
        // TODO Auto-generated method stub
        
    }
    
}


package Observer.homework;
//天气的消息实体
public class WeatherInfo {
    private String time;
    private String weather;
    private String info;

    public WeatherInfo(String time,String weather, String info){
        this.time = time;
        this.weather = weather;
        this.info = info;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getWeather() {
        return weather;
    }
    public void setWeather(String weather) {
        this.weather = weather;
    }
    
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    @Override
    public boolean equals(Object obj) {
        WeatherInfo info = (WeatherInfo) obj;
        return info.time==this.time&&info.weather.equals(this.weather);
    }
}

下载

https://download.csdn.net/download/m0_61504367/85232118
在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论