首页 > 编程语言 >18.(行为型模式)java设计模式之观察者模式

18.(行为型模式)java设计模式之观察者模式

时间:2023-01-16 22:01:56浏览次数:36  
标签:java observer Observer void 主题 观察者 模式 设计模式 public

一、什么是观察者模式

定义对象间⼀种⼀对多的依赖关系,使得每当⼀个对象改变状态,则所有依赖于它的对象都会得到通知并⾃动更新,也叫做发布订阅模式Publish/Subscribe,属于⾏为型模式

二、观察者模式的实现方式

模式结构分析:

Subject主题:持有多个观察者对象的引⽤,抽象主题提供了⼀个接⼝可以增加和删除观察者对象;有⼀个观察者数组,并实现增、删及通知操作。

Observer抽象观察者:为具体观察者定义⼀个接⼝,在得到主题的通知时更新⾃⼰。

ConcreteSubject具体主题:将有关状态存⼊具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。

ConcreteObserver具体观察者:实现抽象观察者⻆⾊所要求的更新接⼝,以便使本身的状态与主题的状态保持⼀致。

类关系图:

统一模型:

代码实现:

查看代码

/*
 * 抽象主题
 * */
public class Subject {
    private List<Observer> observerList = new ArrayList<>();

    /*
     * 新增观察者
     * */
    public void addObserver(Observer observer) {
        this.observerList.add(observer);
    }

    /**
     * 删除观察者
     *
     * @param observer
     */
    public void deleteObserver(Observer observer) {
        this.observerList.remove(observer);
    }

    /*
     * 通知所有的观察者
     * */
    public void notifyAllObserver() {
        for (Observer observer : this.observerList) {
            observer.update();
        }
    }
}
/*
*
* 老板完成工作,开始视察下属的工作情况
* */
public class BossConcreteSubject extends Subject {
    public void dosomething() {
        System.out.println("老板完成自己的工作");
        //还有其他操作
        System.out.println("视察公司工作情况");
        super.notifyAllObserver();
    }
}
/*
* 抽象观察者
* */
public interface Observer {
    //接受到变更通知之后,进行正常的处理
    void update();
}
/*
* LW接受到通知
* */
public class LWConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("⽼王发现领导到来,暂停在线摸⻥,回归⼯作");
    }
}
/*
* 安娜接受到通知
* */
public class AnnaConcreteObserver implements Observer{
    @Override
    public void update() {
        System.out.println("Anna发现领导到来,暂停在线摸⻥,回归⼯作");
    }
}

测试用例:

/*
* 观察者模式
* */
@Test
public void observer(){
    //创建⼀个主题,⽼板
    BossConcreteSubject subject = new BossConcreteSubject();
    //创建观察者,就是摸⻥的同事
    Observer lwObserver = new LWConcreteObserver();
    //创建观察者,就是摸⻥的同事
    Observer annaObserver = new AnnaConcreteObserver();
    //建⽴对应的关系,⽼板这个主题被同事进⾏观察
    subject.addObserver(lwObserver);
    subject.addObserver(annaObserver);
    //主题开始活动,⾥⾯会通知观察者(相当于发布消息)
    subject.dosomething();
}

测试结果:

老板完成自己的工作
视察公司工作情况
⽼王发现领导到来,暂停在线摸⻥,回归⼯作
Anna发现领导到来,暂停在线摸⻥,回归⼯作

方法评估:

优点:

  • 降低了⽬标与观察者之间的耦合关系,⽬标与观察者之间建⽴了⼀套触发机制。
  • 观察者和被观察者是抽象耦合的。

缺点:

  • 观察者和观察⽬标之间有循环依赖的话,会触发它们之间进⾏循环调⽤,可能导致系统崩溃。
  • ⼀个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

标签:java,observer,Observer,void,主题,观察者,模式,设计模式,public
From: https://www.cnblogs.com/q994321263/p/17053578.html

相关文章

  • 学习模式-组合模式
    组合模式组合模式(CompositePattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的......
  • [JavaScript]前端解析cookie为对象
    参考解析页面传参varcookie_str=document.cookievarcookie_arr=cookie_str.split(";")varcookie_obj={}for(vari=0;......
  • 13.(行为型模式)java设计模式之模板模式
    一、什么是模板模式定义⼀个操作中的算法⻣架,将算法的⼀些步骤延迟到⼦类中,使得⼦类可以不改变该算法结构的情况下重定义该算法的某些特定步骤,属于⾏为型模式二、模板模......
  • 【Javaweb】给tomcat添加第三方jar包
    就是复制到lib文件夹里面之后点击jar包右键 选择modulelibrary,点击ok就可以了 ......
  • JavaScript验证API
    验证API两个方法:checkValidity():如果input元素中的数据是合法的返回true,否则返回false;setCustomValidity():设置input元素的validationMessage属性,用于自定义错误提示......
  • 学习记录-迭代器模式
    迭代器模式迭代器模式(IteratorPattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式......
  • 学习记录-备忘录模式
    备忘录模式备忘录模式(MementoPattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。介绍意图:在不破坏封装性的前提下,捕获一个对象的内......
  • 14.(行为型模式)java设计模式之策略模式
    一、什么是策略模式  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可......
  • 创建设计模式
    一、前言最近看了一些有关设计模式的相关书籍和博客,学习了几种常用的设计模式,归纳总结一下学习笔记。二、什么是创建型设计模式?在软件工程中,创建型设计模式是处理对象创......
  • Java面试题Day09
    1.创建线程的三种方法(1)继承Thread类,重写父类run()方法.(2)实现runnable接口(3)使用ExcutorService,Callable,Future实现有返回结果的多线程(JDK1.5以后)2.多线程同......