设计模式学习二之观察者模式1

  观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了。观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸。

  怎么实现呢?考虑接口的应用,以及List容器的使用等。

  

主题接口,相当于报社
package com.csshu;

 主题接口,具有注册观察者和移除观察者方法
public interface mysubject {
    public void registerObserver(myobserver o);
    public void removeObserver(myobserver o);

}
这里需要提供注册(交钱)和取消(相当于读者不想继续订阅报纸了)这两个方法,没错
这些方法需要在主题(报社)里面实现,而观察者(读者)需要去调用,下面有分享。

观察者接口
package com.csshu;

public interface myobserver {
    public void update(int a,int b,int c);
}

这里是观察者1的实现,
package com.csshu;

public class Observer implements myobserver {

    @Override
    public void update(int a, int b, int c) {
        System.out.println(a+"---one,"+b+"---"+c);
    }

}

第二个观察者,
package com.csshu;

public class Observer2 implements myobserver {

    @Override
    public void update(int a, int b, int c) {
        System.out.println(a+"---two,"+b+"---"+c);
    }

}

主题对象的实现,
package com.csshu;

import java.util.ArrayList;
import java.util.List;

public class Subject implements mysubject{
    private List<myobserver> array = new ArrayList<>();
    @Override
    public void registerObserver(myobserver o) {
        array.add(o);
    }

    @Override
    public void removeObserver(myobserver o) {
        int index = array.indexOf(o);
        if (index > -1){
            array.remove(index);
        }
    }

    public void notifyDatasetchange(int a ,int b,int c){
        for (int i=0;i<array.size();i++){
            array.get(i).update(a, b, c);
        }
    }

}
可以看到,我们实现了两个方法,主要是通过List来实现的,通过notifyDatasetchange方法
来给每个注册的观察者更新在主题中可以传递的数值,这里我们传递a,b,c

最后是main方法,
package com.csshu;

public class mains {
    public static void main(String[] args) {
        Subject sub = new Subject();
        Observer o1 = new Observer();
        Observer2 o2 = new Observer2();
        sub.registerObserver(o1);
        sub.registerObserver(o2);
        sub.notifyDatasetchange(1, 2, 3);
    }
}
我们new了一个主题,两个观察者,这里是通过调用主题对象里面的方法注册观察者,当然
可以更含蓄的通过观察者的构造方法传递主题对象的引用,然后再调用其注册方法。
主题用notify来把需要传递的数据传递给观察者。
时间: 2024-08-08 05:23:06

设计模式学习二之观察者模式1的相关文章

设计模式学习(二)-简单工厂模式

---恢复内容开始--- 简单工厂设计模式 简单工厂模式定义: 简单工厂设计模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂主要分为如下几个角色 抽象产品(abstract product):为所有具体产品的抽象表现,一般为抽象类 具体产品(product):为抽象产品的具体实现 生成产品工厂(facto

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

Java设计模式学习笔记(观察者模式)

观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件:观察者和主题. 这段代码是主题的接口: package obeserver; public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer obse

设计模式学习笔记之观察者模式

观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 观察者模式中,分为推和拉两种模式. 推模式,即主题对象向观察者对象推送状态值,不管观察者对象是否需要,并且推送全部数据或者部分数据. 拉模式,即主题对象通知观察者对象状态值已改变,观察者根据自己需要决定是否主动到主体对象中获取详细信息. 两种模式的比较 1.推模型是假定主题对象知道观察者需要的数据:而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者

设计模式(二)—— 观察者模式

观察者模式类似出版社与订阅者的关系,订阅者能够收到出版社发出的消息,可以取消订阅.出版社在观察者模式中称为主题(Subject)订阅者称为观察者(Observer). 主题可以添加观察者,如果有事件发送给观察者.一般Subject中有可以注册.移除.执行事件.Observer一般在实现接口Interface中有Update来获取事件.在观察者中有2种方 法拉和推.拉是由观察者获取所需要的主题内容,一般在Update中发送Object Subject,而推是由Subject主动发送,一般包括所需的

设计模式(二)学习----动态代理

动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象.Spring AOP采用的核心思想就是动态代理设计模式.  下面看动态代理的UML类图: 下面思考问题:invocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的? 动态代理类: package com.lp.ecjtu.DynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect

设计模式学习之观察者模式(Observer,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3.使用观察者模式的好处:维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便.什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. private static void M

【C++深入浅出】设计模式学习之观察者模式

前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使他们能够自动更新自己. 通过一张visio的UML图片介绍一下子功能关系. subject类:抽象通知者类,一般用一个抽象类或者接口实现,把所有对观察者的引用都放到一个集合里,每个抽象通知者类可以有任意数量的观察者,抽象通知者类提供一个接口

java/android 设计模式学习笔记(2)---观察者模式

这篇来讲一下观察者模式,观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统.订阅--发布系统等.因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了. PS:对技术感兴趣的同鞋加群544645972一起交流. 设计模式