• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

观察者模式

开发技术 开发技术 4小时前 3次浏览

观察者模式,其实有点类似订阅。

角色:观察者,被观察者,一个被观察者与观察者是一对多的关系。

直白解析:

被观察者A,观察者B,观察者C.

A被B和C同时观察,当A发生改变,B和C都感知到变化。

要求:

实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。

 

模式的结构

观察者模式的主要角色如下。

  1. 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  2. 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  3. 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  4. 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

 

下面代码直接复制运行就可以:

package com.shandiangou.trade.controller.service.impl;

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

public class test {

public static void main(String[] args) {
Rate rate = new RMBrate();
Bank nonghangBank = new NonghangBank();
Bank renminBank = new RenminBank();
rate.add(nonghangBank);
rate.add(renminBank);
rate.change(15);
rate.change(-10);
}
}

//抽象目标:汇率
abstract class Rate {
protected List<Bank> banks = new ArrayList<Bank>();

//增加观察者方法
public void add(Bank bank) {
banks.add(bank);
}

//删除观察者方法
public void remove(Bank bank) {
banks.remove(bank);
}

public abstract void change(int number);
}

//具体目标:人民币汇率
class RMBrate extends Rate {
public void change(int number) {
for (Bank obs : banks) {
((Bank) obs).response(number);
}
}
}

//抽象观察者:银行
interface Bank {
void response(int number);
}

//具体观察者1:农行
class NonghangBank implements Bank {
public void response(int number) {
if (number > 0) {
System.out.println("人民币汇率升值" + number + "个基点,农行小挣10个亿。");
} else if (number < 0) {
System.out.println("人民币汇率贬值" + (-number) + "个基点,农行小亏10个亿。");
}
}
}

//具体观察者2:人民银行
class RenminBank implements Bank {
public void response(int number) {
if (number > 0) {
System.out.println("人民币汇率升值" + number + "个基点,人民银行小挣15个亿。");
} else if (number < 0) {
System.out.println("人民币汇率贬值" + (-number) + "个基点,人民银行小亏15个亿。");
}
}
}

程序员灯塔
转载请注明原文链接:观察者模式
喜欢 (0)