重学设计模式(三设计模式-观察者模式)

Posted 穆瑾轩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学设计模式(三设计模式-观察者模式)相关的知识,希望对你有一定的参考价值。

1、观察者模式

    以前在学校上晚自习,有的同学吃零食,有的同学玩手机,还有的同学在聊天,突然有个同学(被观察者)跑进来,说了就老师来了,得到通知的同学们(观察者),立刻做出反应,吃零食的同学立刻把零食藏了起来,玩手机的同学也收起来了手机,聊天的同学也正襟危坐的端起了书本。这就是我们所说的观察者模式。

1.1、什么是观察者模式

  • 定义

    观察者模式是一种行为设计模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    这种模式和发布-订阅模式很像,不同的是,发布-订阅模式,一般有一个调度中心,调度中心有拉模式和推模式来推送消息。

观察者模式的结构:

    1)抽象观察者(Observer)角色:是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。

    2)具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

    3)抽象主题(Subject)角色:它提供了一个用于保存观察者对象的类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。

    4)具体主题(Concrete Subject)角色:它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。

    观察者模式的意图在于:主要解决多个对象间存在一对多的依赖关系,当一个对象状态改变给其他对象通知的问题,让主题和观察者之间松耦合。

1.2、观察者模式的优缺点

  • 优点

    1)符合开闭原则,引入新的观察者无需更改主题(目标)的代码,降低了主题与观察者之间的耦合关系;

    2)可以在运行时建立对象之间的关系。

  • 缺点

    当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

1.3、创建方式

    我们以晚自习,学生看到班主任来巡视为例。

1)抽象观察者(Observer)角色

//抽象观察者
public interface Observer 

	void response(); //反应

2)具体观察者(Concrete Observer)角色

//不同的观察者,做出不同的反应
//具体观察者-学生A
public class ConcreteStudentA implements Observer

	@Override
	public void response() 
		System.out.println("学生A,收起自己的零食");
	



//具体观察者-学生B
public class ConcreteStudentB implements Observer

	@Override
	public void response() 
		System.out.println("学生B,收起自己的手机");
	



//具体观察者-学生C、D
public class ConcreteStudentCD implements Observer

	@Override
	public void response() 
		System.out.println("学生C和D,停止聊天,正襟危坐的看书");
	

3)抽象主题(Subject)角色

//抽象主题,提供保存观察者的类,可以新增或移除观察者
public abstract class Subject 

	 protected List<Observer> observers = new ArrayList<Observer>();
	 
	//增加观察者方法
    public void add(Observer observer) 
        observers.add(observer);
    
    //删除观察者方法
    public void remove(Observer observer) 
        observers.remove(observer);
    
    
    public abstract void notifyObserver(); //通知观察者方法

4)具体主题(Concrete Subject)角色

//具体主题
public class ConcreteSubject extends Subject

	@Override
	public void notifyObserver() 
		System.out.println("被观察者看到班主任来了,喊了一句:老师来了!");
		for (Object obs : observers) 
			((Observer)obs).response(); //观察者做出反应
		
	

5)客户端

public class Client 

	public static void main(String[] args) 
		 Subject subject = new ConcreteSubject();
	     Observer obsA = new ConcreteStudentA();
	     Observer obsB = new ConcreteStudentB();
	     Observer obsC = new ConcreteStudentCD();
	     subject.add(obsA);
	     subject.add(obsB);
	     subject.add(obsC);
	     subject.notifyObserver(); //通知观察者
	

案例效果:

 

此时的UML关系图:

1.4、总结及建议

    观察者模式的在对象间定义一对多的依赖,当一个对象改变状态,依赖的对象都会收到通知,并自动更新。Swing、JavaBeans、RMI中都有观察者模式的应用。

应用场景:

    1)对象间存在一对多关系,一个对象的状态发生改变会影响其他对象时,可以使用观察者模式;

    2)当应用程序中的某些对象必须观察其他对象时,可以使用观察者模式。

JDK中观察者模式的应用:

    java.util.Observer/ java.util.Observable

    java.util.EventListener

以上是关于重学设计模式(三设计模式-观察者模式)的主要内容,如果未能解决你的问题,请参考以下文章

重学设计模式(三设计模式-单例模式)

重学设计模式(三设计模式-组合模式)

重学设计模式(三设计模式-原型模式)

重学设计模式(三设计模式-迭代器模式)

重学设计模式(三设计模式-迭代器模式)

重学设计模式(三设计模式-责任链模式)