标签:-- tac des his update obs name java 状态改变
??观察者模式(别名--发布-订阅)是软件设计模式的一种。观察者模式属于行为型模式。(行为型模型-特别关注对象之间的通信)
??观察者模式(Observer)完美的将观察者和被观察的对象分离开。观察者设计模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动更新。
??易用和低耦合,保证高度的协作。
1.定义一个抽象被观察者接口,添加、删除、通知观察者
package com.designpattern.observerPattern;
/**
* 被观察者接口 Observable
*
* @author zhongtao on 2018/9/10
*/
public interface Observable {
/**
* 添加观察者
*/
void addObserver(Observer observer);
/**
* 移除观察者
*/
void removeObserver(Observer observer);
/**
* 通知观察者
*/
void notifyObserver();
}
2.定义一个抽象观察者接口
package com.designpattern.observerPattern;
/**
* 观察者接口 Observer
*
* @author zhongtao on 2018/9/10
*/
public interface Observer {
/**
* 更新消息
*/
void update(String message);
}
3.实现被观察者,有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合。
package com.designpattern.observerPattern;
import java.util.ArrayList;
import java.util.List;
/**
* 具体被观察者
*
* @author zhongtao on 2018/9/10
*/
public class ConcreteObservable implements Observable {
// 用来存储观察者对象的集合
private List<Observer> list = new ArrayList<Observer>();
//消息
private String message;
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(!list.isEmpty()) {
list.remove(observer);
}
}
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.update(message);
}
}
/**
* 设置更新消息
* @param message
*/
public void setNotifyMessage(String message){
this.message = message;
System.out.println("更新消息:" + message);
notifyObserver();
}
}
4.实现观察者
package com.designpattern.observerPattern;
/**
* 具体实现观察者
*
* @author zhongtao on 2018/9/10
*/
public class User implements Observer {
private String name;
public User(String name){
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + "你有新消息了:" + message);
}
}
5.测试观察者模式
package com.designpattern.observerPattern;
import org.junit.Test;
/**
* 观察者模式测试类
*
* @author zhongtao on 2018/9/10
*/
public class ObserverPatternTest {
/**
* 测试观察者模式
*/
@Test
public void testObserverPattern() {
ConcreteObservable observable = new ConcreteObservable();
User peter = new User("Peter");
User make = new User("Make");
User lina = new User("Lina");
//添加观察者
observable.addObserver(peter);
observable.addObserver(make);
observable.addObserver(lina);
observable.setNotifyMessage("星际争霸2中人族太IMBA");
System.out.println("-----分割线-----");
observable.removeObserver(peter);
observable.setNotifyMessage("星灵才是最IMBA的!");
}
}
测试结果:当移除peter之后,peter就无法再收到推送消息了。
更新消息:星际争霸2中人族太IMBA
Peter你有新消息了:星际争霸2中人族太IMBA
Make你有新消息了:星际争霸2中人族太IMBA
Lina你有新消息了:星际争霸2中人族太IMBA
-----分割线-----
更新消息:星灵才是最IMBA的!
Make你有新消息了:星灵才是最IMBA的!
Lina你有新消息了:星灵才是最IMBA的!
标签:-- tac des his update obs name java 状态改变
原文地址:https://www.cnblogs.com/zt19994/p/9625416.html