大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己。
简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法。另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体观察者可以持有具体Subject的引用,以便了解具体Subject的状态)
大话设计模式中的截图:

代码例子:

AbstractSubject类:


 1 package com.longsheng.observer;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public abstract class AbstractSubject {
7
8 private String subjectState;
9 private List<AbstractObserver> mList = new ArrayList<AbstractObserver>();
10
11 public String getSubjectState() {
12 return subjectState;
13 }
14
15 public void setSubjectState(String subjectState) {
16 this.subjectState = subjectState;
17 }
18
19 public void addObserver(AbstractObserver mAbstractObserver) {
20 mList.add(mAbstractObserver);
21 }
22
23 public void removeObserver(AbstractObserver mAbstractObserver) {
24 mList.remove(mAbstractObserver);
25 }
26
27 public void notifyObservers() {
28 for (AbstractObserver mAbstractObserver : mList) {
29 mAbstractObserver.update();
30 }
31 }
32 }

Secretary类(ConcreteSubject):


1 package com.longsheng.observer;
2
3 public class Secretary extends AbstractSubject {
4 //此类中的方法已在抽象类中实现,所以暂不需要添加新方法
5 }

AbstractObserver类:


 1 package com.longsheng.observer;
2
3 public abstract class AbstractObserver {
4
5 protected String observerName;
6 protected AbstractSubject mAbstractSubject;
7
8 public AbstractObserver(String name, AbstractSubject mSubject) {
9 observerName = name;
10 mAbstractSubject = mSubject;
11 }
12
13 public abstract void update();
14
15 }

StockObserver类(ConcreteObserver):


 1 package com.longsheng.observer;
2
3 public class StockObserver extends AbstractObserver {
4
5 public StockObserver(String name, AbstractSubject mSubject) {
6 super(name, mSubject);
7 }
8
9 @Override
10 public void update() {
11 System.out.println(mAbstractSubject.getSubjectState() + " , "
12 + this.observerName + "关闭股票界面,继续工作");
13 }
14
15 }

NBAObserver类(ConcreteObserver):


 1 package com.longsheng.observer;
2
3 public class NBAObserver extends AbstractObserver {
4
5 public NBAObserver(String name, AbstractSubject mSubject) {
6 super(name, mSubject);
7 }
8
9 @Override
10 public void update() {
11 System.out.println(mAbstractSubject.getSubjectState() + " , "
12 + this.observerName + "关闭NBA直播,继续工作");
13 }
14
15 }

客户端:


 1 package com.longsheng.observer;
2
3 public class Client {
4
5 public static void main(String[] args) {
6 Secretary mSecretary = new Secretary();
7 StockObserver mStockObserver = new StockObserver("小红", mSecretary);
8 NBAObserver mNBAObserver = new NBAObserver("小黄", mSecretary);
9
10 mSecretary.addObserver(mStockObserver);
11 mSecretary.addObserver(mNBAObserver);
12
13 mSecretary.setSubjectState("经理回来啦");
14 mSecretary.notifyObservers();
15 }
16
17 }

运行结果:


1 经理回来啦 , 小红关闭股票界面,继续工作
2 经理回来啦 , 小黄关闭NBA直播,继续工作

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。

使用场景:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象需要改变时,应该考虑使用观察者模式。

一个抽象模型有两个方面,其中一方面依赖于另外一方面,这时候观察者模式可以将这两者封装在独立的对象中使它们各自独立的改变和复用

大话设计模式_观察者模式(Java代码),布布扣,bubuko.com

时间: 2024-08-02 06:57:49

大话设计模式_观察者模式(Java代码)的相关文章

大话设计模式_适配器模式(Java代码)

适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 简单描述: 大话设计模式中的截图: 代码例子: AbstractPlayer类: 1 package com.longsheng.adapter; 2 3 public abstract class AbstractPlayer { 4 5 public abstract void attack(); 6 7 public abstract void defenc

大话设计模式_装饰模式(Java代码)

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 简单描述:1一个父类A(主要给各具体装饰者可以设置待装饰对象),1个具体待装饰类(继承于父类A),1个抽象装饰者(继承父类A),多个具体装饰者(继承抽象装饰者).装饰者持有父类A的引用,每个装饰者在调用方法时都先调用持有的引用的对应方法,另外可在方法中再添加自己的功能(貌似描述得比较复杂,其实就是一传一,每个中间者都可以添加自身的功能) 大话设计模式中的截图: Component是定义一个对象接口,可以给

大话设计模式_单例模式(Java代码)

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 简单描述:构造函数设置为private,以禁止外部类实现本类.本类中提供一个静态方法返回一个本例对象(注意多线程中的实现) 大话设计模式中的截图: 代码例子: Singleton类: 1 package com.longsheng.singleton; 2 3 public class Singleton { 4 5 private static Singleton instance = null; 6 private stati

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla