`

观察者模式(触发联动)

阅读更多
import java.util.Observable;

/**
 * Created by bashen on 2016/7/5.
 */
public class WeatherSubject extends Observable {

    //推送的内容
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
        //通知之前,记得设置这个
        super.setChanged();
        //这里是主动通知,即 推模型
        super.notifyObservers(content);

        //拉模型
        //super.notifyObservers();
    }

}

 

import java.util.Observable;
import java.util.Observer;

/**
 * Created by bashen on 2016/7/5.
 */
public class WeatherObsever implements Observer{

    //观察者名称
    private String observerName;

    public String getObserverName() {
        return observerName;
    }

    public void setObserverName(String observerName) {
        this.observerName = observerName;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(getObserverName() + "收到了消息,目标推送过来的是:" + arg);

        //System.out.println(getObserverName() + "收到了消息,主动到目标对象中去拉,拉的内容是:" + ((WeatherSubject)o).getContent());
    }
}

 

public class Client {

    public static void main(String[] args) {
        //创建一个被观察者
        WeatherSubject subject = new WeatherSubject();

        //创建观察者
        WeatherObsever girl = new WeatherObsever();
        girl.setObserverName("小花");

        WeatherObsever boy = new WeatherObsever();
        boy.setObserverName("小明");

        //注册观察者
        subject.addObserver(girl);
        subject.addObserver(boy);

        //发布消息
        subject.setContent("天气晴,气温28℃,适合出游");

    }
}

 

使用场景:

第一 当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化
第二 如果在更改一个对象的时候,需要同时连带改变其他对象,而且不知道究竟应该有多少对象需要被连带改变
第三 当一个对象必须通知其他的对象,但是你又希望这个对象和其他被它通知的对象是松散耦合的

 

方法介绍:

Observable的简单功能介绍:
addObserver(Observer o)  添加观察着
clearChanged() 清除变化,则把“变化标志”设为false
countObservers() 统计观察着数量
deleteObserver(Observer o) 删除观察者
deleteObservers() 删除所有的观察者
hasChanged() 测试是否有变化(则返回“变化标志”)
notifyObservers() 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法)
notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法),并把参数arg传过去
setChanged() 设置变化,则把“变化标志”设为true

Observable的简单功能介绍
update(Observable o, Object arg) Observable唯一的方法,在被通知时被Observable调用

 

 

分享到:
评论

相关推荐

    10观察者模式1

    4. **触发联动代码**:过多的观察者可能导致连锁反应,需要谨慎设计以避免不必要的代码执行。 在实际应用中,为克服这些缺点,可以考虑使用如下的优化策略: - 使用懒通知,只有真正需要的观察者才被通知。 - 分组...

    安卓三级联动省市联动多级联动相关-Android高仿美团外卖点菜联动列表效果.rar

    5. **数据绑定与数据观察者模式**:在MVVM架构中,我们可以使用LiveData或RxJava等工具实现数据绑定和观察者模式。这样,当某个层级的数据改变时,相关的视图会自动更新,实现联动效果。 6. **动画效果**:为了提升...

    RecyclerView三级联动

    可以使用接口或者观察者模式来实现这一功能。 4. 动态加载:在用户选择第一级或第二级时,根据选择的结果动态请求和加载下一级的数据。这通常涉及到网络请求或者数据库查询,需要确保数据加载的异步处理,以避免...

    Android-Recyclerview实现列表联动

    这通常可以通过接口回调或者使用LiveData、RxJava等观察者模式实现。例如,可以定义一个接口`OnItemClickListener`,让Activity或Fragment实现这个接口,然后在Adapter中调用接口方法来通知外部数据已改变。 4. **...

    java_pattern_observer:23个java模式

    观察者模式的本质:触发联动当目标的状态发生改变时,就是触发相应的通知给所有注册的观察者。2.优点:1) 实现了观察者和目标之间的抽象耦合如果不用观察者模式,目标的变化需要直接一一通知给所有的观察者对象。...

    iOS 分类菜单栏联动选择界面

    KVO是一种观察者模式,可以监听对象属性的变化。在这个项目中,可能使用了KVO来监听UITableView的选中行变化,一旦检测到变化,就会触发相应的事件,更新UICollectionView的显示。 4. MVC(Model-View-Controller...

    ios-UICollectionView 与 UITableView 的联动处理.zip

    2. 观察者模式: 为了实时同步两个列表的状态,可以使用KVO(Key-Value Observing)或者NotificationCenter来监听一个列表的变动,并在另一个列表中做出响应。例如,当UICollectionView中的某个项被选中时,可以...

    一道asp.net c#面试题

    在`Main`方法中,我们创建了一个猫对象,两个老鼠对象和一个主人对象,将它们加入到猫的观察者列表中,然后调用`Cat.Cry()`,触发猫的叫声,进而触发老鼠逃跑和主人被惊醒的联动效应。 另一种实现方法是使用C#的...

    c#笔试题 c#笔试题

    这种实现方式简洁明了,符合观察者模式的定义,但存在一定的局限性,如无法方便地移除观察者,以及使用ArrayList存储观察者可能导致类型不安全的问题。 另一种设计方法是使用事件(event)和委托(delegate)。在C#...

    省市联动选择控件

    这通常通过监听事件、回调函数或者观察者模式来实现,确保UI与数据模型之间的同步。 4. Android开发:在Android环境中,"省市联动选择控件"可以使用Spinner、RecyclerView等组件实现。Spinner适合简单的两级联动,...

    ios-tableView联动swift和oc.zip

    联动通常指的是在一个`UITableView`中选择某个项目时,触发另一个`UITableView`的更新,或者两个`UITableView`之间的数据同步。这种效果常见于多级分类选择、筛选条件设置等场景。 在Objective-C中实现`UITableView...

    参考资料-W0626_安全阀及报警联动系统动作测试记录.zip

    测试通常包括静态和动态两个阶段,前者检查未加载时的安全阀设定,后者模拟真实工况,观察安全阀在压力变化下的响应。 其次,报警联动系统则是监控现场状态并触发警报的组件,当检测到异常如压力超标、温度过高或...

    ios-Swift视图联动.zip

    当被观察对象的某个属性值改变时,观察者会接收到通知,从而更新视图。然而,Swift更推荐使用WillSet和DidSet属性观察器,它们在属性值更改前后触发,提供了一种安全的、类型安全的方式来监听属性的变化。 4. ** ...

    项目一消防报警及联动控制系统描述.pptx

    中心记录并显示火灾位置,同时触发联动控制,例如启动疏散警铃、广播通知、电梯控制、通风排烟、紧急照明和自动喷淋系统。 2. **系统结构与组成**:消防报警及联动控制系统包括火灾探测部分(探测器、手动报警按钮...

    Android例子源码省市区3级联动菜单和数据库

    此外,还可以使用LiveData或RxJava实现数据观察者模式,实现实时更新UI。 7. JSON数据:在实际项目中,省市区数据可能来源于服务器。可以使用Gson或Jackson库解析JSON数据,将其存入数据库。 8. Android布局设计:...

    深入浅出设计模式中文第一章

    4. **观察者模式**:为了更好地处理行为的联动,如鸭子飞行时触发其他动作,观察者模式提供了一种机制,使得一个对象的状态变化可以自动通知依赖于它的其他对象,而无需显式调用。 #### 结论:设计模式的力量 设计...

    导航菜单横向左右滑动并和下方的控件实现联动(实用1).zip

    为了实现下方控件与导航菜单的联动,开发者可能使用了接口回调或者观察者模式。当用户在导航菜单中选择不同的选项时,菜单会触发一个事件,这个事件可以被下方的控件监听到,从而更新其显示内容。这种设计符合...

    消防联动测试记录表.pdf

    测试过程中,操作员会模拟火警信号,观察消防泵是否能在规定时间内启动,同时监测其出水量和压力是否符合设计标准。测试结果应详细记录,包括泵的型号、启动时间、运行状态等,以便对任何异常情况进行及时排查和修复...

    实现combox二级

    可以通过Qt Creator或其他IDE进行编译和调试,观察不同选择下的联动效果。 7. **UI设计**:虽然描述中未提及,但实际应用中,二级联动可能会涉及到UI布局和设计,如使用QGridLayout或QVBoxLayout等布局管理器,以及...

    HCIP DAY1 静态路由与bfd联动实验拓扑

    4. **故障模拟**:人为中断或模拟链路故障,观察BFD如何快速检测到问题并触发路由协议的快速收敛。 5. **验证功能**:通过命令行界面检查路由状态和BFD会话状态,确保系统按照预期工作。 这个实验对于理解静态路由...

Global site tag (gtag.js) - Google Analytics