策略模式:定义了对象之间的一对多依赖,这样一来,这样一来当一个发生改变的时候,它的所有依赖都会发生变化
观察者模式代码如下
1主题接口也就是那个可能会发生数据变化
public
interface
Subject
{
//将观察者注入到主题中
public
void
registerObserver(Observer
o
);
//将观察者从主题中去除
public
void
removeObserver(Observer
o
);
//当主题的数据发生变化的时候,这个方法会通知所有的观察者
public
void
notifyObserver();
}
2观察者接口,当数据发生变化的时候这里会随之发生变化
public
interface
Observer
{
//当主题状态改变时,这个方法会被调用,以通知所有的观察者
public
void
update(
float
temp
,
float
humidity
,
float
pressure
);
}
3更新数据的显示接口,他只负责更新数据
public
interface
DisplayElement
{
//当布告板需要显示时调用此方法
public
void
display();
}
4主题的实现类也就是1的实现类
//数据类
public
class
WeatherData
implements
Subject
{
//设置观察者的数组
private
ArrayList
observer
;
private
float
temp
;
private
float
humidity
;
private
float
pressure
;
//初始化的时候创建数组,这个用来存放观察者集合
public
WeatherData()
{
observer
=
new
ArrayList();
}
// 注册
@Override
public
void
registerObserver(Observer
o
)
{
observer
.add(
o
);
}
// 删除
@Override
public
void
removeObserver(Observer
o
)
{
int
i
=
observer
.indexOf(
o
);
//查找到的情况下才删除
if
(
i
>=0)
{
observer
.remove(
i
);
}
}
//通知每一位观察者
@Override
public
void
notifyObserver()
{
for
(
int
i
=0;
i
<
observer
.size();
i
++)
{
Observer
o
=(Observer)
observer
.get(
i
);
o
.update(
temp
,
humidity
,
pressure
);
}
}
//从气象站得到更新时反馈给观察者
public
void
measurementsChanged()
{
notify();
}
//监测站更细数据
public
void
setMeasurement(
float
temp
,
float
humidity
,
float
pressure
)
{
this
.
temp
=
temp
;
this
.
humidity
=
humidity
;
this
.
pressure
=
pressure
;
}
}
5观察者类实现了观察者接口以及使数据更新的更新接口
public
class
CurentConditionsDisplay
implements
Observer,DisplayElement
{
private
float
temperature
;
private
float
humidity
;
private
Subject
weathData
;
//将布告板注册到主题中
public
CurentConditionsDisplay(Subject
weathData
)
{
this
.
weathData
=
weathData
;
weathData
.registerObserver(
this
);
}
//更新
public
void
update(
float
temp
,
float
humidity
,
float
pressure
)
{
this
.
humidity
=
humidity
;
display();
}
//展示
@Override
public
void
display()
{
System.
out
.println(
"CurrentConditions"
+
humidity
);
}
}
我觉得这个设计模式在这个里面用的比较好的一点就是o.updata()这个更新方法将观察者进行了更新
还有它的核心就是一些在构造函数里面进行的一系列的初始化比如数组的初始化,以及在构造参数里面进行注册
,看着就好像是你中有我我中有你相互这件有关联的关系,但是观察者有多个,所以最后的结果就达到了一对多的关系
jdk自带的也有观察者模式但是会出现一系列的问题