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

观察者模式定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

Observer

package com.singland.dp.observer;

public interface Observer {
    public void update(Subject subject);
}

MyObserver1

package com.singland.dp.observer;

public class MyObserver1 implements Observer {

    @Override
    public void update(Subject subject) {
        System.out.println(String.format("MyObserver1: You are %s ?", subject.getMsg()));
    }
}

MyObserver2

package com.singland.dp.observer;

public class MyObserver2 implements Observer {

    @Override
    public void update(Subject subject) {
        System.out.println(String.format("MyObserver2: You are %s ?", subject.getMsg()));
    }
}

Subject

package com.singland.dp.observer;

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

public class Subject {

    private String msg;

    private List<Observer> observers = new ArrayList<Observer>();

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }

}

MyTest

package com.singland.dp.observer;

import org.junit.Test;

public class MyTest {

    @Test
    public void test() {
        Subject subject = new Subject();
        subject.registerObserver(new MyObserver1());
        subject.registerObserver(new MyObserver2());
        subject.setMsg("Linda");
        subject.notifyObservers();
    }

}

当项目中的业务逻辑有关于出版者跟订阅者的概念的时候,我们应该第一时间想到使用观察者设计模式来处理问题,观察者设计模式应该是最常见的设计模式了,java甚至提供了内置的观察者设计模式供开发人员使用,但是java内置的观察者设计模式还是有一些局限性的:

1. java.util.Observable是一个类而非接口,这违背了面向对象设计原则:面向接口编程而非针对实现编程。

2. setChanged方法是protected的,这意味着如果我们要使用这个方法就必须继承自Observable类,而java是只能单继承的,违背了组合优于继承原则

以上缺点限制了java内置观察者模式的可复用性。

当然,如果以上缺点并不会对项目中的业务逻辑造成什么问题的话,就大胆使用java内置观察者模式吧。

时间: 2024-10-11 16:37:13

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

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

1.1概述 在许多设计中,经常涉及多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,在这样的情况下就可以使用观察者模式. 例如,某些寻找工作的人对"求职中心"的职业需求信息的变化非常关心,很想追踪"求职中心"中职业需求信息的变化.一位想知道"求职中心"职业需求信息变化的人需要成为"求职中心"的求职者,即让求职中心把自己登记到求职中心的"求职者"列表中,当一个人成为

Java设计模式学习笔记,二:工厂模式

工厂模式,主要实现了创建者和调用者的分离. 分类:1.简单工厂模式:2.工厂方法模式:3.抽象工厂模式. 核心:实例化对象时,用工厂方法代替new操作. 一.简单工厂模式 也叫静态工厂模式,工厂类中实现静态方法,根据入参,生产不同的产品,工程项目中常用. 工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码. 1 package com.corey.factory.simpleFactory; 2 3 /** 4 * 产品类接

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

老生长谈的两个设计模式了,这里把这两个设计模式对比着来总结一下. 什么是简单工厂模式? 简单工厂模式:根据传入工厂类的参数动态决定要创建哪一个产品类的实例. UML图如下(以实现一个计算器为例): 简单工厂模式的Java代码实现如下: 1 package designPattern; 2 /** 3 * 简单工厂模式 4 * @author yiRain 5 * 6 */ 7 public class SimpleFactory { 8 9 public static void main(Str

设计模式学习笔记(二十二:备忘录模式)

1.1概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态.这就是备忘录模式的定义. 对象的状态依赖于它的变量的取值情况,对象在程序运行期间的各个时刻可能具有不同的状态.在某些应用中,程序可能需要使用一种合理的方式来保存对象在某一时刻的状态,以便在需要时,对象能恢复到原先保存的状态.在备忘录模式中,称需要保存状态的对象为"原发者",称负责保存原发者状态的对象为"备忘录",称负责管理备忘录的对象为

设计模式学习笔记(二) 设计基本原则之【单一职责原则】

单一职责原则(SRP: Single Responsibility Principle) 名词解释: 1) 职责:是指类变化的原因. 2) 职责扩散:就是因为某种原因,职责P被分化为粒度更细的职责P1和P2. 3) 可变类:是指创建该类的实例后,可以对其属性进行修改. 4)不可变类:是指创建该类的实例后,不可对其属性进行修改.不可变类是线程安全的. 1.应用场景 一个类T负责两个不同的职责:职责P1.职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原来运行的职责P2功能发生故障

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

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

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

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很