观察者模式:
定义对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新.
观察者模式的四个角色:
1.Subject(目标)
2.ConcreteSubject(具体目标)
3.Observer(观察者)
4.ConcreteObserver(具体观察者)
举例说明:
多人联机对战中,一个队友遭受攻击将给其他的盟友发送通知.
具体实现:
/**
*
* @ClassName: ControlCenter
* @Description: 指挥部,充当目标抽象类
* @author haibiscuit
* @date 2019年10月22日 下午6:02:49
*
*/
public abstract class ControlCenter {
protected String name; //队伍名称
protected List<Observer> list = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//加入战队
public void join(Observer observer) {
list.add(observer);
}
//撤出战队
public void quit(Observer observer) {
list.remove(observer);
}
//抽象方法
public abstract void notifyObserver(String name);
}
/**
*
* @ClassName: ConcreteControllCenter
* @Description: 具体目标类
* @author haibiscuit
* @date 2019年10月22日 下午8:50:23
*
*/
public class ConcreteControllCenter extends ControlCenter{
public ConcreteControllCenter(String name) {
System.out.println("战队-"+name+"-创建成功!");
this.name = name;
}
@Override
public void notifyObserver(String name) {
System.out.println(name+"遭受攻击!");
for (Observer observer : list) {
if(!((Player)observer).getName().equals(name)) {
observer.help();
}
}
}
}
/**
*
* @ClassName: Observer
* @Description: 抽象观察者类
* @author haibiscuit
* @date 2019年10月22日 下午6:16:54
*
*/
public abstract class Observer {
protected abstract void help();
protected abstract void beAttacked(ControlCenter controlCenter);
}
/**
*
* @ClassName: Player
* @Description: 具体观察者类
* @author haibiscuit
* @date 2019年10月22日 下午6:20:30
*
*/
public class Player extends Observer{
private String name ;
public Player(String name) {
this.name = name;
}
@Override
protected void help() {
System.out.println(name+"来救你!");
}
@Override
protected void beAttacked(ControlCenter controlCenter) {
controlCenter.notifyObserver(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
*
* @ClassName: ObserverTest
* @Description: 观察者模式的测试类
* @author haibiscuit
* @date 2019年10月22日 下午8:51:05
*
*/
public class ObserverTest {
public static void main(String args[]) {
ControlCenter controlCenter = new ConcreteControllCenter("英雄战队!");
Observer observer1,observer2,observer3,observer4;
observer1 = new Player("猪队友1");
observer2 = new Player("猪队友2");
observer3 = new Player("猪队友3");
observer4 = new Player("猪队友4");
controlCenter.join(observer1);
controlCenter.join(observer2);
controlCenter.join(observer3);
controlCenter.join(observer4);
observer1.beAttacked(controlCenter);//一个队友被攻击,呼唤其他队友
}
总结:
可以看到,观察者模式和中介者模式非常的相像,两者在原有代码的基础上稍微变动就可以相互转换,只是代码实现的
方式不同.
至于具体的使用场景肯定是完成组件与组件之间的通信了.