- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java设计模式开发中使用观察者模式的实例教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中。关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同。 关键要素 。
主题
主题是观察者观察的对象,一个主题必须具备下面三个特征.
观察者
当主题发生变化,收到通知进行具体的处理是观察者必须具备的特征.
为什么要用这种模式 。
这里举一个例子来说明,牛奶送奶站就是主题,订奶客户为监听者,客户从送奶站订阅牛奶后,会每天收到牛奶。如果客户不想订阅了,可以取消,以后就不会收到牛奶.
松耦合 。
观察者增加或删除无需修改主题的代码,只需调用主题对应的增加或者删除的方法即可。 主题只负责通知观察者,但无需了解观察者如何处理通知。举个例子,送奶站只负责送递牛奶,不关心客户是喝掉还是洗脸。 观察者只需等待主题通知,无需观察主题相关的细节。还是那个例子,客户只需关心送奶站送到牛奶,不关心牛奶由哪个快递人员,使用何种交通工具送达.
Java实现观察者模式 1. Java自带的实现 类图 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/**
* 观察目标 继承自 java.util.Observable
* @author stone
*
*/
public
class
UpdateObservable
extends
Observable {
private
int
data;
public
UpdateObservable(Observer observer) {
addObserver(observer);
/*
* add other observer
*/
}
public
int
getData() {
return
data;
}
public
void
setData(
int
data) {
if
(data !=
this
.data) {
this
.data = data;
setChanged();
//标记 改变, 只有标记后才能通知到
notifyObservers();
//通知
}
}
@Override
public
synchronized
void
addObserver(Observer o) {
super
.addObserver(o);
}
@Override
public
synchronized
void
deleteObserver(Observer o) {
super
.deleteObserver(o);
}
@Override
public
void
notifyObservers() {
super
.notifyObservers();
}
@Override
public
void
notifyObservers(Object arg) {
super
.notifyObservers(arg);
}
@Override
public
synchronized
void
deleteObservers() {
super
.deleteObservers();
}
@Override
protected
synchronized
void
setChanged() {
super
.setChanged();
}
@Override
protected
synchronized
void
clearChanged() {
super
.clearChanged();
}
@Override
public
synchronized
boolean
hasChanged() {
return
super
.hasChanged();
}
@Override
public
synchronized
int
countObservers() {
return
super
.countObservers();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 观察者 实现 java.util.Observer接口
* @author stone
*
*/
public
class
UpdateObserver
implements
Observer {
@Override
public
void
update(Observable o, Object arg) {
System.out.println(
"接收到数据变化的通知:"
);
if
(o
instanceof
UpdateObservable) {
UpdateObservable uo = (UpdateObservable) o;
System.out.print(
"数据变更为:"
+ uo.getData());
}
}
}
|
2. 自定义的观察模型 类图 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 抽象观察者 Observer
* 观察 更新
* @author stone
*
*/
public
interface
IWatcher {
/*
* 通知接口:
* 1. 简单通知
* 2. 观察者需要目标的变化的数据,那么可以将目标用作参数, 见Java的Observer和Observable
*/
// void update(IWatched watched);
void
update();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 抽象目标 Subject
* 提供注册和删除观察者对象的接口, 及通知观察者进行观察的接口
* 及目标 自身被观察的业务的接口
* @author stone
*
*/
public
interface
IWatchedSubject {
public
void
add(IWatcher watch);
public
void
remove(IWatcher watch);
public
void
notifyWhatchers();
public
void
update();
//被观察业务变化的接口
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**
* 具体观察者 Concrete Observer
*
* @author stone
*
*/
public
class
UpdateWatcher
implements
IWatcher {
@Override
public
void
update() {
System.out.println(
this
+
"观察到:目标已经更新了"
);
}
}
|
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/**
* 具体目标角色 Concrete Subject
* @author stone
*
*/
public
class
UpdateWatchedSubject
implements
IWatchedSubject {
private
List<IWatcher> list;
public
UpdateWatchedSubject() {
this
.list =
new
ArrayList<IWatcher>();
}
@Override
public
void
add(IWatcher watch) {
this
.list.add(watch);
}
@Override
public
void
remove(IWatcher watch) {
this
.list.remove(watch);
}
@Override
public
void
notifyWhatchers() {
for
(IWatcher watcher : list) {
watcher.update();
}
}
@Override
public
void
update() {
System.out.println(
"目标更新中...."
);
notifyWhatchers();
}
}
|
。
监听器是观察者的一种实现: 类图 。
1
2
3
4
5
6
7
8
|
/**
* 监听 用户在注册后
* @author stone
*
*/
public
interface
IRegisterListener {
void
onRegistered();
}
|
1
2
3
4
5
6
7
8
|
/**
* 监听 当用户登录后
* @author stone
*
*/
public
interface
ILoginListener {
void
onLogined();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/*
* 监听器 是观察者模式的一种实现
* 一些需要监听的业务接口上添加 监听器,调用监听器的相应方法,实现监听
*/
public class User {
public void register(IRegisterListener register) {
/*
* do ... register
*/
System.out.println("正在注册中...");
//注册后
register.onRegistered();
}
public void login(ILoginListener login) {
/*
* do ... login
*/
System.out.println(
"正在登录中..."
);
//登录后
login.onLogined();
}
}
|
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/**
* 观察者(Observer)模式 行为型模式
* 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时观察某一个目标对象。
* 这个目标对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己
* 目标对象中需要有添加、移除、通知 观察者的接口
*
* @author stone
*/
public
class
Test {
public
static
void
main(String[] args) {
/*
* 使用Java自带的Observer接口和Observable类
*/
UpdateObservable observable = new UpdateObservable(new UpdateObserver());
observable.setData(99);
System.out.println("");
System.out.println("");
/*
* 自定义的观察者模型
*/
IWatchedSubject watched = new UpdateWatchedSubject();
watched.add(new UpdateWatcher());
watched.add(new UpdateWatcher());
watched.update();
System.out.println("");
/*
* 子模式-监听器
*/
User user =
new
User();
user.register(
new
IRegisterListener() {
@Override
public
void
onRegistered() {
System.out.println(
"监听到注册后。。。"
);
}
});
user.login(
new
ILoginListener() {
@Override
public
void
onLogined() {
System.out.println(
"监听到登录后。。。"
);
}
});
}
}
|
。
打印 。
1
2
3
4
5
6
7
8
9
10
11
|
接收到数据变化的通知:
数据变更为:99
目标更新中....
observer.UpdateWatcher@457471e0观察到:目标已经更新了
observer.UpdateWatcher@5fe04cbf观察到:目标已经更新了
正在注册中...
监听到注册后。。。
正在登录中...
监听到登录后。。。
|
。
最后此篇关于Java设计模式开发中使用观察者模式的实例教程的文章就讲到这里了,如果你想了解更多关于Java设计模式开发中使用观察者模式的实例教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
AngularFire2 文档演示了以下将观察者绑定(bind)到您的 Firebase 可观察对象的模式: this.item = af.database.object('/item'); {{ (
我正在使用观察者模式和 BlockingQueue 添加一些实例。现在在另一种方法中,我正在使用队列,但似乎 take() 一直在等待,即使我这样做: /** {@inheritDoc} */ @Ov
我遇到问题 - 创建具有不同属性的订单。在我的工作案例中,用户有大约 10 个不同的属性,每个属性有 3-4 个变体。 我正在使用 Angular js,并编写了两个函数: 二传手 $scope
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
假设我想创建一组基于类型的观察者。也就是说,当他们收到事件通知时,他们会被告知其中一个参数的类型,然后根据是否可以对该类型进行操作来决定是否采取行动。 有没有简单的方法可以做到这一点?我认为这对于泛型
快速提问。 当 setChanged() 和 notifyObservers() 被调用并且 Observer.update() 运行时,它是否在一个新的 Thread,还是在同一个Thread中?
我必须为可观察对象和观察者创建代码。正如您所知,每个观察者都有自己的“更新”方法。 在我的可观察代码中,我使用了“notifyObservers”方法。它的参数是一个字符串数组,其中包含有关我的项目的
是否有一种设计模式可以形成“复合”观察者/可观察对象? 我的意思是我有一个可观察的 A 通知它的听众一些变化。 每个监听器也是一个可观察对象,并通知自己的监听器(在它执行的某些操作中,哪个操作是由第一
我对以下代码为何不起作用感到有点困惑: MutableLiveData mutableTest = new MutableLiveData<>(); MediatorLiveData mediator
场景:我有两个名为 FirstFragment 的 fragment 和 UnitFragment .我来自 FirstFragment至UnitFragment选择一个单位返回FirstFragme
我想了解如何 平面 map 作品。我知道这是处理 Observable> 的一种方式。 无论如何,我正在测试它的行为并陷入困境: let plusDom = document.querySelecto
我有 public class mammal implements Imammle { public String getName() { return "Mammal";
如果我使用 KVO 来观察我的播放器项目,如下所示: AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
我想在正在使用的变量上使用观察者,这是我的代码: const get = Ember.get; uploader:Ember.inject.service('uploader'), progressC
我一直在使用Laravel Observers每当我的模型被删除/更新/保存时处理我的应用程序逻辑。我注意到在某些情况下这些观察者不会被触发。例如,如果我使用 Model::where(active,
我有一个工作人员服务来发送一些简单的通知。但现在,我想在发送之前检查数据库中的一些数据。 但是,我不能在工作线程中使用观察者,它必须在主线程中。我有一个错误类型 java.lang.IllegalSt
我有 2 个字段:美元和日元。当我更改美元字段时,我想在日元字段中显示转换后的数字,反之亦然。 我的问题是这样的: 如果我有 2 个带有观察者的字段,例如: addTextChangedListene
在 View Controller 中,我创建了一个 subview 数组,可以随时从父 View 中删除,因此它们的生命周期比 View Controller 的生命周期短。 创建它们时,我几乎这样
如何在另一个线程上运行 RxJava,因为主线程上的工作太多。 我在一个方法内运行观察者,下面是代码 fragment : public void updatePie() { RxJavaPlugin
我是一名优秀的程序员,十分优秀!