针对问题:在消息-通知 的程序结构中,为了通知待通知的对象,需在消息服务中持有所有的待通知的对象,消息服务和大量的待通知对象紧密的耦合在一起,无论是新添加一个通知对象、或是取消通知都必须改变消息服务。为了解决这个问题,消息服务(主题)必须提供注册和删除的接口,不仅如此,主题要想统一管理待通知的对象(观察者),所有观察者必须遵循某一规范,也就是在所有观察者中抽象出一个接口,主题无须打理观察者是什么,只要它遵循规范就行,这样就将以前的耦合进行了抽象,也就是松耦合。
观察者模式结构图:
观察者模式实现代码:
/**
* 主题接口
* @author bruce
*
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
/**
* 观察者接口
* @author bruce
*
*/
public interface Observer {
public void update();
}
/**
* 主题实现
* @author bruce
*
*/
public class ConcreteSubject implements Subject{
private List<Observer> observers=new ArrayList<Observer>();
public void notifyObservers() {
for(Observer observer:observers){
observer.update();
}
}
public void registerObserver(Observer observer) {
if(!observers.contains(observer)){
observers.add(observer);
}
}
public void removeObserver(Observer observer) {
if(observers.contains(observer)){
observers.remove(observer);
}
}
}
/**
* 观察者A
* @author bruce
*
*/
public class ConcreteObserverA implements Observer{
private Subject subject;
public ConcreteObserverA(Subject subject){
this.subject=subject;
this.subject.registerObserver(this);
}
public void update() {
// TODO Auto-generated method stub
System.out.println("通知观察者A");
}
}
/**
* 观察者B
* @author bruce
*
*/
public class ConcreteObserverB implements Observer{
private Subject subject;
public ConcreteObserverB(Subject subject){
this.subject=subject;
this.subject.registerObserver(this);
}
public void update() {
// TODO Auto-generated method stub
System.out.println("通知观察者B");
}
}
/**
* 测试
* @author bruce
*
*/
public class Client {
public static void main(String[] args) {
Subject subject=new ConcreteSubject();//创建主题
Observer observerA=new ConcreteObserverA(subject);//创建观察者A,并注册
Observer observerB=new ConcreteObserverB(subject);//创建观察者B,并注册
System.out.println("---------");
subject.notifyObservers();
System.out.println("---------");
subject.removeObserver(observerA);//观察者A取消收听
subject.notifyObservers();
/**
* output:
* ---------
通知观察者A
通知观察者B
---------
通知观察者B
*
*/
}
}
- 大小: 5.9 KB
分享到:
相关推荐
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
DesignPattern_BasicKnowledge设计模式之类关系:设计模式 类关系 基础 依赖 关联
协调多个对象之间的交互——中介者模式(三)20.3 完整解决方案为了协调界面组件对象之间的复杂交互关系,Sunny公司开发人员使用中介者模式来设计客户信息管理窗
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
DesignPattern 设计模式,共10章。内容详细,案例设计齐全。对设计可复用的面向对象的软件很有帮助,有助你写出又质量,并且可重复使用的高品质软件
本书已经成为面向对象技术人员的圣经和词典,书中定义的23个模式逐渐成为开发界技术交流所必备的基础知识和语汇。
C++ 23种设计模式(全_解释+源代码).zip 23种设计模式都是基于以下原则,务必记牢 依赖倒转原则 里氏代换原则 开闭原则 接口隔离原则 合成聚合复用原则 迪米特法则 23种设计模式如下:
JAVA design pattern-java设计模式.chm
Design Pattern: Simple Factory 模式 Design Pattern: Abstract Factory 模式 Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 Design Pattern: Singleton...
Design*Pattern*Framework*4.5
深入浅出设计模式 (Head First Design Pattern)_带书签 深入浅出设计模式 (Head First Design Pattern)_带书签
Mobile Design Pattern Gallery : UI Patterns for Mobile Applications原版 全彩 120M大容量《移动应用ui设计模式》是一本移动应用ui 设计模式参考书,分10 大类介绍了70 个移动应用设计模式(包括反模式),用400 ...
Theresa Neil's new book "Mobile Design Pattern Gallery" provides solutions to common design challenges. There is inspiration on every topic from designing your application's navigation to choosing ...
VS2019 工程实现观察者模式和工厂模式,具体模式讲解请参考 https://me.csdn.net/lovemengx
Design Pattern 简明手册,设计模式查阅简明手册
JAVA software design pattern
C语言设计模式 PDF《C Design Pattern》C语言设计模式 PDF《C Design Pattern》C语言设计模式 PDF《C Design Pattern》C语言设计模式 PDF《C Design Pattern》
GoF的经典著作设计模式(Design Pattern)
DesignPattern 新版設計模式(C#) 講述23種設計模式: ◆結構圖 ◆生活例子 ◆意圖 ◆適用性 ◆示例代碼 ◆實際應用