浅析设计模式二 观察者模式

观察者模式
观察者模式: JDK使用最多的模式之一
为了方便理解,举个例子
    1.报社的业务就是出版报纸
    2.订阅报纸,只要哦出版新报纸,就会给你送来
        取消订阅,就不会送了
    3.只要报社正常运行,就会有人订阅或者退订
 
在观察者模式中,报社改为 "主题(Subject)",订阅者改为"观察者(Observer)"
 
主题对象管理某些数据
观察者注册主题,主题数据改变时能收到更新
普通对象增加订阅,就会成为观察者对象
观察者取消订阅就会,就不会再收到更新的数据,成为普通对象
 
观察者模式:
        定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新
 
    观察者提供了一种对象设计,让主题和观察者之间松耦合
    因为,关于观察者的一切,主题只知道观察者继承了某个接口和自己建立关系,
    
    但是主题并不知道观察者是谁
    任意时候我们都可以增减观察者.因为主题唯一依赖的东西是一个实现Observer接口的对象列表
 
    假如出现新的观察者类,我们不需要修改主题的代码,
    假如有个新的具体类需要当观察者,不需要为了兼容他而更改主题代码
    
    主题只需发送通知给所有实现了观察者接口的对象
 
    改变主题/观察者任意一方,并不会影响另外一方,只要他们之间的接口被遵守,就可以自由的改变他们
 
设计原则: 
        为了交互对象之间的松耦合设计而努力
        松耦合的设计之所以能让我们的OO系统如此富有弹性,应对变化,是因为对象之间的依赖关系降到最低
        注:OO 面向对象 Object Oriented
 
public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservsers();//主题改变即调用
}
public interface Observer {
    void update (Long temp, Long humidity,Long pressure);
}
 
public interface DisplayElement {
    public void display();//布告板显示调次方法
}   
/**
 * 数据站
 * @author Dougest
 * 2017年5月26日   上午9:03:26
 *
 */
public class WeatherData implements Subject{
    private ArrayList observers;
    private Long temp;
    private Long humidity;
    private Long pressure;
    
    public WeatherData() {
        observers = new ArrayList();
    }
    public void registerObserver(Observer o) {
        observers.add(o);
        
    }
 
    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if(i >= 0) observers.remove(i);
        else throw new RuntimeException("取消订阅失败");
    }
 
    public void notifyObservers() {
        for(int i = 0; i< observers.size(); i++) {
            Observer o = (Observer) observers.get(i);
            o.update(temp, humidity, pressure);
        }
    }
    
    public void setChange(Long temp, Long humidity,Long pressure){
        this.humidity = humidity;
        this.temp = temp;
        this.pressure = pressure;
        notifyObservers();
    }
 
}
/**
 * 布告板
 * @author Dougest 
 *    2017年5月23日
 */                                            //实现次接口可以在weather获取改变//所有布告板都实现接口
public class CurrentConditionsDisplay implements Observer,DisplayElement{
    private Long temperature;
    private Long humidity;
    private Subject weatherData;
    
    public CurrentConditionsDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }
    @Override
    public void display() {
        System.out.println("temperature: "+temperature+"   humidity: "+humidity);
    }
 
    @Override
    public void update(Long temperature, Long humidity, Long pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }
 
}
 
    @Test
    public void test1() {
        WeatherData w = new WeatherData();
        CurrentConditionsDisplay c = new CurrentConditionsDisplay(w);
        HeatIndexDisplay h = new HeatIndexDisplay(w);
        w.setmeasurements(1l, 1l, 1l);
        w.setmeasurements(2l, 2l, 2l);
        w.setmeasurements(3l, 3l, 3l);
        
    }
 
temperature: 1   humidity: 1
p1  t1
temperature: 2   humidity: 2
p2  t2
temperature: 3   humidity: 3
p3  t3
 
    /***********************使用java内置的观察者模式************************/
 
 
java.util.Observble中notifyObserver()方法导致观察者是无序的,他不是一个接口,而是一个类,没有接口,无法建立自己的实现
但是Java是单继承,如果使用它就无法继承其他超类,
而且.serChanges()方法被保护起来了,被protected修饰
冲突了我们前面的设计原则 "多用组合,少用继承"
 
/***********************要点************************/
 
1.观察者模式定义了对象之间一对多的的关系
2.主题(可观察者)用一个共同的接口来更新观察者
3.观察者和被观察者之间使用松耦合(loosecoupling)的方式结合,可观察者不知道主题的细节,只知道观察者实现了主题的接口
4.使用次模式,你可以被主题推"推(push)"或"拉(pull)"数据(然而,推的方式被认为更加正确)
5.有多个观察者时,不可以依赖特定的通知次序
6.java有多种观察者模式的实现,包括通用的java.util.Observable
7.注意java.util.Observable带来的一些问题
8.如果有必要的话,可以实现自己的观察者模式
9.Swing大量使用观察者模式,虚度GUI框架也是如此
10.此模式也被用在很多地方,如javaBean,RMI
 
设计原则:
        找出程序中会变化的部分,然后将其和固定不变的方面分离

转载于:https://www.cnblogs.com/dougest/p/6908007.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值