观察者模式:又称发布-订阅模式、模型-视图模式。一般在需要其他对象告知自己需要发生改变时使用。例如A表发生改变后,需要告知B更新数据。可以动态的实现添加多个观察者,也可以随时删除观察者。
观察者模式可以使用在需要根据一个对象的改变动态的修改其他对象,或者激发其他对象相应的事件,而同时又不清楚会有多少个对象的时候。将数据与具体的表现充分分离,符合开闭原则。但同时需要注意,如果多个观察者之间如果存在者交叉依赖的话,可能会引起死循环。如果观察者过多那么依次通知每个观察者将会非常耗时。需要注意到,观察者模式不应该将对象具体的变化以及为什么会发生变化告知给观察者,应该充分将数据与具体的操作也就是表现分离开来。
本例实现一个动态的简易通讯录,实现当一个用户修改了自己的通讯方式时,其他用户可以动态获取到更新的内容。
代码如下
import java.util.ArrayList;
import java.util.List;
public class test
{
public static void main(String[] args)
{
player a=new player("A");
player b=new player("B");
player c=new player("C");
player d=new player("D");
subject s=new subject();
s.addObServer(a);
s.addObServer(b);
s.addObServer(c);
s.addObServer(d);
a.setSubject(s);
b.setSubject(s);
c.setSubject(s);
d.setSubject(s);
s.show();
a.change();
}
}
abstract class obServer
{
public abstract void show();
}
class player extends obServer
{
String name;
subject s;
public player(String name)
{
this.name=name;
}
public void show()
{
System.out.println(name);
}
public void change()
{
name+=name;
System.out.println("Somebody's name changed.Scaning all mumbers...");
s.show();
}
public void setSubject(subject s)
{
this .s=s;
}
}
class subject
{
List<obServer> sub;
public subject()
{
sub=new ArrayList<obServer>();
}
public void addObServer(obServer o)
{
sub.add(o);
}
public void show()
{
for(obServer i : sub)
{
i.show();
}
}
public void changed()
{
show();
}
}
结果如下
A
B
C
D
somebody's name changed.scaning all mumbers...
AA
B
C
D
2016-8-24
12:01