学习笔记JAVA中观察者设计模式

基础概念

  观察者模式: 对象行为模型的一种,定义对象之间的一种一对多依赖关系,是得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

 代码演示

public class Subject {

/**
* ###实现思路####
* 1.定义一个集合容器,装载观察者对象
* 2.定义一个注册方法
* 3.定义一个消息更新方法
* 4.定义一个删除方法
*/
private List<Observer> observers = new ArrayList();

/**
* 注册
* @param observer 观察者对象
*/
public void enroll(Observer observer){
observers.add(observer);
}

public void sendMessage(String message){
//循环遍历注册的观察者,并给其发消息
for (Observer observer:observers){
observer.update(message);
}
}

/**
* 移除观察者
* @param observer
*/
public void delete(Observer observer){
observers.remove(observer);
}
}
public class ConcreteSubject extends Subject {

/**
* ####主要功能####
* 将变化的消息通知给观察者
*/
public void inform(String message){
this.sendMessage(message);
}

public void remove(Observer observer){
this.delete(observer);
}
}

public interface Observer {

/**
* ###设计思路#####
* 统一管理 所有观察者对象
*/

/**
* 通知消息接口
* @param message
*/
void update(String message);
}

public class ObserverImpl1 implements Observer {
@Override
public void update(String message) {
System.out.println("1号观察者收到消息:"+message);
}
}
public class ObserverImpl2 implements Observer {
@Override
public void update(String message) {
System.out.println("2号观察者收到消息:"+message);
}
}
public class ObserverTest {

public static void main(String[] args){
//创建观察者目标
Subject subject = new ConcreteSubject();
//创建2个观察者
Observer observer1 = new ObserverImpl1();
Observer observer2 = new ObserverImpl2();
//分别注册到观察者目标中
subject.enroll(observer1);
subject.enroll(observer2);
//观察者目标开始给观察者发消息
subject.sendMessage("鬼子进村了");
//移除1号观察者
subject.delete(observer2);
//在进行发一次消息
subject.sendMessage("八路军撤退了");
}
}
-------------------------
测试结果

1号已经收到:鬼子进村了
2号已经收到:鬼子进村了
1号已经收到:八路军撤退了

----------------------------------------------

实际在JDK中已经封装了上述代码的 Subject和 Observer 类 我们只需要写观察者目标和观察者继承即可

/**
* @description: jdk自带观察者对象父类
*/
public class ConcreteSubject extends Observable {

//定义一个消息内容
private String msg;

public String getMsg(){
return this.msg;
}
/**
* 定义一个发消息方法
*/
public void sendMsg(String msg){
this.msg = msg;
//设置改变通知状态
super.setChanged();
//通知
super.notifyObservers();
}
}

mport java.util.Observable;
import java.util.Observer;


public class ObserverImpl1 implements Observer {

@Override
public void update(Observable o, Object arg) {
System.out.println("1号收到消息:"+((ConcreteSubject) o).getMsg() );
}
}

mport java.util.Observable;
import java.util.Observer;


public class ObserverImpl2 implements Observer {

@Override
public void update(Observable o, Object arg) {
System.out.println("2号收到消息:"+((ConcreteSubject) o).getMsg() );
}
}
-----------
运行结果


posted on 2019-09-11 17:41  追风筝的人123  阅读(156)  评论(0编辑  收藏  举报

导航