入门设计模式之观察者

学习更多设计模式请参考:入门设计模式之汇总篇

观察者模式:多个观察者对象同时观察一个主题对象,当这个主题对象发生变化时,会通知所有的观察者

来看一下下方类图

  • Subject:主题类,所有主题的父类,负责对观察者的管理,有添加观察者,删除观察者,通知所有的方法
  • SubjectImpl:主题子类,拥有状态属性,当状态改变时会调用父类的notifyObserver方法通知所有观察者
  • Observe:观察者,定义了接受主题变化通知的方法
  • ObserveImpl:观察者实现类,实现了update()方法用于接受通知

下面给出代码实现

public  class Subject {
    private List<Observer> list=new ArrayList<>();

    public void add(Observer observer){
        list.add(observer);
    }

    public void remove(Observer observer){
        list.remove(observer);
    }

    public void notifyObserver(){
        list.forEach((observer)->observer.update());
    }
}

public class SubjectImpl extends Subject {
    private String state="new";

    public void change(){
        state="old";
        notifyObserver();
    }
}

public interface Observer {
    public void update();
}

public class ObserverImpl implements  Observer {
    @Override
    public void update() {
        System.out.println("对象更新了");
    }
}

原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9248999.html

时间: 2024-10-16 23:15:57

入门设计模式之观察者的相关文章

C++设计模式实现--观察者

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合.     意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>]  特点: 1.  Subj

入门设计模式之桥梁

学习更多设计模式请参考:入门设计模式之汇总篇 桥梁模式:将抽象化与实现化脱藕,使二者可以独立的变化 大家应该对日志记录比较熟悉,不知道有没有自己写过一个日志处理的程序,你又是如何实现的呢? 今天的桥梁模式就根据一下需求来分析一下: 支持2个以上平台 支持2个以上格式 大家可以看一下这个需求哈,2个以上,那我就实现2个呗,一般人可能都会这样想.然后开始写,比如Windows存Txt格式.Windows存Xml格式.Linux存Txt格式的.Linux存Xml格式的,刷刷刷分分钟的就写好了. 但是如

入门设计模式之合成

学习更多设计模式请参考:入门设计模式之汇总篇 合成模式的职责是将对象组织到树结构中 观察上方类图: interface,一个接口定义了一个获得当前对象名字的方法 leaf:树中的叶子节点,实现了interface Branch:树枝节点,不仅实现了getName方法,同样它本身具有添加节点删除节点的方法且本身可以包含多个树枝节点以及叶子节点 通过上述结论我们可以发现其实合成模式就是树的结构的实现 来看一下代码: public interface Compent { public String g

入门设计模式之模板

学习更多设计模式请参考:入门设计模式之汇总篇 模板方法:在一个抽象类中定义一部分的实现,其余的定义抽象方法迫使子类实现 相信看了上方的定义以后大家已经理解了模板模式,我们来看一下类图 抽象类定义了4个方法,其中operation是私有的,在这个方法里调用了其他三个方法,而方法3是自己实现的.方法1和2是强迫子类实现的. ClassImpl1,ClassImpl2都继承了抽象类,并分别对方法1和2进行了不同的实现 我们来看代码 public abstract class AbstractClass

入门设计模式之单例

学习更多设计模式请参考:入门设计模式之汇总篇 了解单例模式之前我们先来了解一下单例模式的三个要点: 1.一个类只能有一个实例(就是只需要new一次呗) 2.它必须自行创建这个实例(就是构造方法不对外暴露呗) 3.它必须向整个系统提供这个实例(就是获取实例的方法是静态的呗) 其实通过分析上方三个要点我们就已经了解了单例模式了.也就是说我们只要满足上方的要求就算是一个单例了. 按照上方的要点这里给出几个例子供大家参考一下: 饿汉式: public class HungrySingle { priva

入门设计模式之享元

学习更多设计模式请参考:入门设计模式之汇总篇 享元模式:以共享的方式高效的支持大量的细粒度对象 我们以咖啡为例,一家咖啡店一天卖出几千杯咖啡其实这几千杯也不过是几十种口味.在Java中你觉得是new几千次咖啡好还是new几十次口味好呢?享元模式就是利用的这个原理来共享的变量了. 来看一下类图: FlavorFactory:口味工厂,根据客户所需口味生产咖啡 Client:售货员,负责通知工厂生产咖啡,以及出售咖啡和统计销售情况 Coffee:咖啡接口 Flavor:咖啡口味,实现了咖啡接口,并且

入门设计模式之策略

学习更多设计模式请参考:入门设计模式之汇总篇 策略模式:使算法在不影响客户端的情况下发生变化. 例如某宝上的一件商品,有时候8折并返现3元.有时候7折返现1元.有时候9折不返现.有时候不打折返现2元等等,我们可以看到这个商品不同时刻要计算利润或者什么的时候是不一样的,现在就可以用到策略模式了. 代码: public abstract class Algorithm { public abstract void method(); } public class Algorithm1 extends

入门设计模式之代理

学习更多设计模式请参考:入门设计模式之汇总篇 代理模式;给某个对象提供一个代理对象,由代理对象持有对原对象的引用. 代理模式就比较符合中国人含蓄的性格,假如有个姑娘想要找个对象,但是直接满大街去喊我要找对象的不是很多吧.大部分的女孩还是倾向于先去找一个媒人,让媒人来给自己介绍对象.这里的媒人其实就是女孩的代理对象了. 先来看一下类图: 我们可以看到女孩跟媒人都实现了一个相亲的接口,然后呢媒人持有女孩的引用来调用女孩展示自己的方法,代码是这样的: public interface BlindDat

入门设计模式之原型

学习更多设计模式请参考:入门设计模式之汇总篇 引言:通过给出一个原型对象来指明所创建的对象的类型,然后复制这个原型对象来创作同类型的对象 Java中使用原型模式必须要满足的条件如下: 1.对于任何对象都有x.clone()!=x .(也就是说克隆的对象和原先的对象不是一个对象) 2.x.clone().getClass()==x.getClass().(克隆出来的对象跟被克隆的对象是类型一样) 3.x.clone().equals(x).(克隆对象的属性应该是与被克隆的对象的属性完全一样的) 一