设计模式总结1--observer pattern

<!-- 设计模式 -->

<!--是一套被反复使用、多数人知

晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了

可重用代码、让代码更容易被他人理解、保证代 码可靠性 -->

-------------------------------------------------------------

<!-- 观察者模式 observer patterns-->

<!-- 对于天气预报的举例,首先这是常规的方法 -->

public class WeatherData {

    private int low;
    private int height;
    private String weather;

    public int getLow() {
        return low;
    }
    public int getHeight() {
        return height;
    }
    public String getWeather() {
        return weather;
    }

    public void setData(int low,int height,String weather){
        this.low = low;
        this.height = height;
        this.weather = weather;

        change();
    }
    private void change() {

        Xiaomi xiaomi = new Xiaomi();
        xiaomi.disPlay(getLow(),getHeight(),getWeather());

        Chuizi chuizi = new Chuizi();
        chuizi.disPlay(getLow(),getHeight(),getWeather());
    }

}

public class Xiaomi {

    public void disPlay(int low, int height, String weather) {
        System.out.println(low + ":" + height + ":" + weather);
    }

}

public class Chuizi {
    public void disPlay(int low, int height, String weather) {
        System.out.println(low + ":" + height + ":" + weather);
    }
}

但是这是有问题的,不够灵活,有的厂商想加上这个功能,有的厂商想去掉这个功能

就像报纸

出版社的任务就是出报纸

你订阅了出版社的报纸,出版社就会将新的报纸给你送

你不需要该出版社的报纸,可以取消订阅

只要出版社还在,就会一直有很多人取消或订阅报纸

观察者模式

定义了对象间一对多的依赖,这样一来,当一个对象的状态改变时,

它的所有依赖都会自动收到通知并自动更新

报社是主题,订阅者是观察者对象

/*定义一个主题接口*/
public interface Subject {

    public void addObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void notifyObserver();

}

/*主题要继承自主题接口,用于添加一些对观察者操作的几个方法*/
public class WeatherData implements Subject{

    private int low;
    private int height;
    private String weather;
    //定义一个list,用于存放所有观察者,方便下面进行通知
    private List<Observer> list = new ArrayList<Observer>();
    public int getLow() {
        return low;
    }
    public int getHeight() {
        return height;
    }
    public String getWeather() {
        return weather;
    }

    public void setData(int low,int height,String weather){
        this.low = low;
        this.height = height;
        this.weather = weather;
        //通知观察者
        notifyObserver();

    }

    //对观察者进行添加
    @Override
    public void addObserver(Observer observer) {
        if(observer == null){
            return;
        }
        if(!list.contains(observer)){
            list.add(observer);
        }

    }
    //通知所有观察者
    @Override
    public void notifyObserver() {
        for(Observer o : list){
            o.update(getLow(), getHeight(), getWeather());
        }
    }
    //删除观察者
    @Override
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }

}

/*定义一个观察者接口,观察者在继承之后要实现他的方法用于更新数据*/
public interface Observer {

    public void update(int low,int height,String weather);
}

public class Xiaomi implements Observer{

    /**
     * 对于观察者,我希望做到不管是添加该业务还是取消,主题端是不管的,所以
     * 定义构造方法,new出来这个对象的时候自动加入到被通知列(成为观察者),
     * 同时还设有取消该业务
     */

    private Subject subject;

    public Xiaomi(Subject subject){
        this.subject = subject;
        subject.addObserver(this);
    }
    public void cancle(){
        subject.removeObserver(this);
    }

    public void disPlay(int low, int height, String weather) {
        System.out.println(low + ":" + height + ":" + weather);
    }

    @Override
    public void update(int low, int height, String weather) {
        disPlay(low,height,weather);
    }

}

public class Chuizi implements Observer{

        private Subject subject;

        public Chuizi(Subject subject){
            this.subject = subject;
            subject.addObserver(this);
        }
        public void cancle(){
            subject.removeObserver(this);
        }

        public void disPlay(int low, int height, String weather) {
            System.out.println(low + ":" + height + ":" + weather);
        }

        @Override
        public void update(int low, int height, String weather) {
            disPlay(low,height,weather);
        }

}

测试运行

public class test {
    public static void main(String[] args) {
        WeatherData data = new WeatherData();

        <!-- 加入该业务 -->
        Xiaomi xiaomi = new Xiaomi(data);
        Chuizi chuizi = new Chuizi(data);
        <!-- 两个都通知 -->
        data.setData(1, 10, "晴朗");
        <!-- 取消该业务 -->
        xiaomi.cancle();
        <!-- 只通知一个 -->
        data.setData(2, 12, "晴朗");

    }
}

======================================================================

======================================================================

======================================================================

java中内置的观察者模式

在这里不是实现了而是继承

public class WeatherData extends Observable {

    private int low;
    private int height;
    private String weather;

    public int getLow() {
        return low;
    }
    public int getHeight() {
        return height;
    }
    public String getWeather() {
        return weather;
    }

    public void setData(int low,int height,String weather) {
        this.low = low;
        this.height = height;
        this.weather = weather;
        change();
    }

    public void change() {
    /*Observable,可以点击进入Observable看里面的方法,首先setChanged()将changed属性改为true
        代表有改变*/
        setChanged();
        /* 通知观察者 */
        <!-- 方式1 -->
        notifyObservers();
        <!-- 方式2 -->
        notifyObservers(new Object[]{getLow(),getHeight(),getWeather()});
    }

}
            

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

public class Htc implements Observer{
/*构造方法,将自己加入通知列*/
    private Observable observable;
    public Htc(Observable observable) {
        this.observable = observable;
        observable.addObserver(this);
    }
    /*取消该业务 */
    public void cancel() {
        observable.deleteObserver(this);
    }

    public void display(int low,int height,String weather) {
        System.out.println("HTC 最低温度:" + low + " 最高温度:" + height + " 天气:" + weather);
    }

    @Override
    public void update(Observable o, Object arg) {
        /*
        拉模式:当要使用的时候再获取
        对应上面的方式1 当创建weatherdata的时候会执行父类的构造方法 这个o是从父类中
        传过来的(传的是this),所以这个o指的是weatherdata本身,强制转换*/
        WeatherData wd = (WeatherData) o;
        display(wd.getLow(), wd.getHeight(), wd.getWeather());

        /*
        推模式:不管你用不用,我先给你
        对应上面的方式2 当使用notifyObservers(new Object[]{getLow(),getHeight(),getWeather()});
            arg不为null*/
        if(arg != null) {
        Object[] array = (Object[]) arg;
        display(Integer.parseInt(array[0].toString()), Integer.parseInt(array[1].toString()), array[2].toString());
        }

    }

}

测试

public class Test {

    public static void main(String[] args) {

        WeatherData wd = new WeatherData();

        Htc htc = new Htc(wd);

        wd.setData(2, 8, "晴天");

    }
}

----------------------------------------------------------------------

----------------------------------------------------------------------

对于要使用自己写的还是java内置的?

java中的主题是要继承的而不是实现的,所以当他已经有了父类的时候就不能再继承其他类

Observable是一个类,主题类只能继承该类,如果主题类已经有

了父类,则无法完成观察者模式,因为Java不支持多继承。

关于观察者模式

该模式定义了对象之间一对多的关系

主题用一个共同的接口来更新观察者

主题和观察者之间用松耦合的方式结合,主题不知道观察者的细节,只知道观察者实现了观察者接口

java中内置了观察者模式

知道使用Java中内置观察者模式的缺点

如有必要,尽量自己实现观察者模式,而不是使用Java中内置的

时间: 2024-10-09 11:01:56

设计模式总结1--observer pattern的相关文章

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

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式

Java设计模式模式观测(Observer Pattern)

Observer Pattern 设计模式通常用于.这是一个事件侦听器模型. 该模型有两个作用,一个是Subject, 有一个Observer.Subject 保存多个Observer参考,一旦一个特定的事件发生.Subject它会通知所有Observer.Observer得到该通知后运行相关程序逻辑. 当中,Observer仅仅有先向Subject注冊后才干被Subject知晓.这就像订报纸,仅仅有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单.然后每当新报纸印好时,出版社会通知订

设计模式-观察者模式(Observer Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 观察者模式简述 观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色,观察者和被观察的对象,当被观察的对象发生变化的时候观察者会接受到相应的通知. 策略模式的定义与基本结构 定义:定义一个一对多的依赖关系,当被多个对象依赖的那个对象发生改变的时候,所有依赖它的对象都会得到相应的通知并进行状态的更新. 让我们来看一张来自<Head First>的结构图. Subje

深入浅出设计模式——观察者模式(Observer Pattern)

模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机. 模式定义观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅(Pu

24种设计模式--观察者模式【Observer Pattern】

 <孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好的一个办法,我们今天就来讲一个间谍的故事. 韩非子大家都应该记得吧,法家的代表人物,主张建立法制社会,实施重罚制度,真是非常有远见呀,看看现在社会在呼吁什么,建立法制化的社会,在 2000 多年前就已经提出了.大家可能还不知道,法家还有一个非常重要的代表人物,李斯,对,就是李斯,秦国的丞相,最终被残忍的车裂的

设计模式--观察者模式【Observer Pattern】

<孙子兵法>有云: "知彼知己,百战不殆:不知彼而知己,一胜一负:不 知彼,不知己,每战必殆" ,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好的一个办法,我们今天就来讲一个间谍的故事. 韩非子大家都应该记得吧,法家的代表人物,主张建立法制社会,实施重罚制度,真是非常有远见呀,看看现在社会在呼吁什么,建立法制化的社会,在 2000 多年前就已经提出了.大家可能还不知道,法家还有一个非常重要的代表人物,李斯,对,就是李斯,秦国的丞

C#设计模式---观察者模式(Observer Pattern)

一.目的 提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象. 二.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为. 三.场景 假设多个用户订阅了微信中的汽车之家公众号,当公众号有新车到来的时候,则会通知所有订阅该公众号的用户,下面用观察者模式来模拟这一场景. 四.实现 1 using System; 2 using System.Collections.Gener

设计模式之二:观察者模式(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.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

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

问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新. 认识模式 该模式在生活中是非经常见的.想想生活中的各种各样的检測系统,报警系统,一旦有重要事件发生时,有关系统总能及时的收到通知.这就是观察者模式. 问题解决 关于观察者模式,java实际上给了我们内置的支持(能够看出该模式还是非经常常使用的吧!)可是我们经常会自己实现. 为什么呢?我们后面会给