版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85526506
使用场景:
- 聊天室程序的创建,服务器创建好后,A,B,C 三个客户端连上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别给其他在线的客户。也就说,每个客户端都需要更新服务器得到数据。
- 大家一起玩CS游戏时,服务器需要将每个人的方位变化发给所有的客户。
我们可以把多个订阅者,客户称之为观察者,需要同步给多个订阅者的数据封装到对象中,称之为目标。
观察者核心是:
- 观察者模式主要用于 1:N 的通知,当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observice),令他们做出响应。
通知观察者的放式:
- 推
- -- 每次都会把通知以广播放式发送给所有的观察者,所有观察者只能被动接受。
- 拉
- -- 观察者只要直到有情况即可。至于什么时候获取内容,获取什么内容,都可以自主决定。
1),创建主题对象如下
/**主题对象
* @author 晓电脑
*/
public class Obsubject {
/**
* 创建保存观察者的集合
*/
protected List<Observice> lists = new ArrayList<>();
/**
* 添加观察者方法
* @param observice
*/
public void addObservice(Observice observice){
lists.add(observice);
}
/**
* 获取当前观察者长度
* @return
*/
public int size(){
return lists.size();
}
/**
* 删除观察者方法
* @param observice
*/
public void removeObservice(Observice observice){
lists.remove(observice);
}
/**
* 通知所有观察者改变了状态
*/
public void notifyObservice(){
lists.stream().forEach(e->e.update(this));
}
}
2),创建观察者接口,和它的实现类
/**
* 观察者接口
*/
public interface Observice {
void update(Obsubject obsubject);
}
/**
* 创建观察者对象类
*/
class UserObservice implements Observice{
private int myState;
@Override
public void update(Obsubject obsubject) {
if (obsubject instanceof ConcreteObsubject){
ConcreteObsubject concreteObsubject = (ConcreteObsubject) obsubject;
myState = concreteObsubject.getState();
}
}
public int myState(){
return this.myState;
}
}
3),创建主题对象的子类
/**创建观察者的实现类
* @author 晓电脑
*/
public class ConcreteObsubject extends Obsubject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
//改变所有观察者对象的state值
this.notifyObservice();
}
}
4),创建客户端进行测试
/**客户端进行测试 -- 观察模式-推送
* @author 晓电脑
*/
public class Client {
public static void main (String[] args) {
// 创建多个观察者对象
UserObservice observice1 = new UserObservice();
UserObservice observice2 = new UserObservice();
UserObservice observice3 = new UserObservice();
//创建集合保存
//创建发送者
ConcreteObsubject obsubject = new ConcreteObsubject();
obsubject.addObservice(observice1);
obsubject.addObservice(observice2);
obsubject.addObservice(observice3);
int size = obsubject.size();
System.out.println(size);
//改变值
obsubject.setState(1000);
//查看观察者的值是否改变
System.out.println(observice1.myState());
System.out.println(observice2.myState());
System.out.println(observice3.myState());
}
}
运行效果:
uml类图如下