理解
”观察者模式”非常简单,就拿”发通知”这件事说,因为这个动机足够强和具体。
俩个角色:
- 被观察者—发送通知的人。
- 观察者—被通知的人,接收通知的人。
很多人喜欢把简单的问题搞的很复杂,定义成四个角色,实际上就上述俩角色,多余的俩角色只不过是该俩角色的抽象。
实现
废话不多说,直接干代码。
被观察者—发通知
定义被观察者的抽象接口
package adp.zj.com.adapterdesparttern.观察者模式;
/**
* 被观察者,通知者
*/
public interface Observerable {
//1.订阅,加入观察者序列内
void regist(Observer observer);
//2.被观察者发送通知
void notifyMsg();
//3.取消注册
void unRegist(Observer observer);
}
定义被观察者的具体实现
package adp.zj.com.adapterdesparttern.观察者模式;
import java.util.ArrayList;
import java.util.List;
public class Observerable_A implements Observerable {
private String strMsg = "通知:xxx";
List<Observer> observerList = new ArrayList<>();
@Override
public void regist(Observer observer) {
observerList.add(observer);
}
@Override
public void notifyMsg() {
for (int i = 0; i < observerList.size(); i++) {
Observer observer = observerList.get(i);
observer.update(strMsg);
}
}
@Override
public void unRegist(Observer observer) {
if (null != observerList) {
observerList.remove(observer);
}
}
}
观察者—接收通知
定义观察者的抽象接口
package adp.zj.com.adapterdesparttern.观察者模式;
/**
* 观察者,被通知者
*/
public interface Observer {
void update(String msg);//接收通知方法
}
定义观察者的具体实现
package adp.zj.com.adapterdesparttern.观察者模式;
public class Observer_A implements Observer {
@Override
public void update(String msg) {
System.out.println(msg);
}
}
一次观察者模式的调用测试
package adp.zj.com.adapterdesparttern.观察者模式;
public class Test {
public static void main(String[] args) {
Observerable observerable = new Observerable_A();
Observer observer_A = new Observer_A();
observerable.regist(observer_A);
observerable.notifyMsg();
}
}