1.定义
定义被观察者与观察者之间的一对多关系,使得Subject改变时,Observers都被通知到 使用较多,如数据库监听、发布-订阅系统
2.UML类图
角色介绍 ISubject : 抽象被观察者 ConcreteSubject : 具体被观察者 IObserver : 抽象观察者 ConcreteObserverA : 具体观察者,观察Subject的变化 ConcreteObserverB : 具体观察者 要点 被观察者持有抽象观察者的引用
3.UML示例代码
public interface IObserver {
void update ( String content) ;
}
public class ConcreteObserverA implements IObserver {
@Override
public void update ( String content) {
System. out. println ( "ConcreteObserverA receive update: " + content) ;
}
}
public class ConcreteObserverB implements IObserver {
@Override
public void update ( String content) {
System. out. println ( "ConcreteObserverB receive update: " + content) ;
}
}
public interface ISubject {
void notifyObservers ( ) ;
}
public class ConcreteSubject implements ISubject {
private List< IObserver> observerList = new ArrayList < > ( ) ;
private String state;
public void setState ( String state) {
this . state = state;
}
public void attach ( IObserver observer) {
this . observerList. add ( observer) ;
}
@Override
public void notifyObservers ( ) {
for ( IObserver observer : observerList) {
observer. update ( "state changed to " + state) ;
}
}
}
public class Client {
public static void main ( String[ ] args) {
ConcreteSubject subject = new ConcreteSubject ( ) ;
IObserver observerA = new ConcreteObserverA ( ) ;
IObserver observerB = new ConcreteObserverB ( ) ;
subject. attach ( observerA) ;
subject. attach ( observerB) ;
subject. setState ( "Active" ) ;
subject. notifyObservers ( ) ;
}
}
2019 - 12 - 16 09 : 38 : 10.203 15870 - 15870 / com. example. observer I/ System. out: ConcreteObserverA receive update: state changed to Active
2019 - 12 - 16 09 : 38 : 10.203 15870 - 15870 / com. example. observer I/ System. out: ConcreteObserverB receive update: state changed to Active
4.总结
优缺点 优点:将被观察者与观察者之间完全解耦(或者叫抽象耦合),应用较为广泛; 缺点:当观察者较多时,注意执行效率,适当采用异步的通知方式。