观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
● 目标:它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法。目标类可以是接口,也可以是抽象类或具体类。
● 具体目标:具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。如果无须扩展目标类,则具体目标类可以省略。
● 抽象观察者:观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法,因此又称为抽象观察者。
● 具体观察者:在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者中定义的更新数据方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。
抽象观察者
//抽象观察者 抽象股民
interface abstractinvestors {
public String getName();
public void setName(String name);
//购买股票
public void buy(Integer num);
//收到通知
public void notice();
}
具体观察者
//具体观察者 具体股民
class investors implements abstractinvestors{
private String Name;
private AllyControlCenter acc;
public investors(AllyControlCenter acc) {
this.acc = acc;
}
@Override
public String getName() {
return this.Name;
}
@Override
public void setName(String name) {
this.Name = name;
}
@Override
public void buy(Integer num) {
System.out.println(this.Name+"购买了"+num+"%");
if(num > 5){
acc.notifyObserver(this.Name);
}else{
System.out.println(this.Name+"未超过5%不发送通知");
}
}
@Override
public void notice() {
System.out.println(this.Name+"收到通知");
}
}
目标
//目标 这里定义为抽象
abstract class AllyControlCenter{
protected List<abstractinvestors> inv = new ArrayList<abstractinvestors>();
//注册方法
public void join(abstractinvestors obs) {
System.out.println(obs.getName() + "加入");
inv.add(obs);
}
//声明抽象通知方法
public abstract void notifyObserver(String name);
}
具体目标
//具体目标类
class ConcreteAllyControlCenter extends AllyControlCenter {
@Override
public void notifyObserver(String name) {
System.out.println(name+"购买超过了5%");
for (abstractinvestors list: inv) {
if(!list.getName().equals(name)){
list.notice();
}
}
}
}
main
class main{
public static void main(String[] args) {
AllyControlCenter cc = new ConcreteAllyControlCenter();
abstractinvestors 股民1 = new investors(cc);
股民1.setName("股民1");
cc.join(股民1);
abstractinvestors 股民2 = new investors(cc);
股民2.setName("股民2");
cc.join(股民2);
abstractinvestors 股民3 = new investors(cc);
股民3.setName("股民3");
cc.join(股民3);
股民1.buy(6);
股民2.buy(3);
}
}