`

易学设计模式11 观察者(Observer)

阅读更多
Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步

1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3)具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时, 向它的各个观察者发出通知。
4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。




Observer(Observer)
NumberGenerator--(Subject)
RandomNumberGenerator--(Concrete Subject)
NumberObserver(Concrete Observer)
SymbolObserver(Concrete Observer)

public interface Observer {
	public void upadate(NumberGenerator generator);
}


public abstract class NumberGenerator {
	
	private List<Observer> observers = new ArrayList<Observer>();
	/** 添加观察者*/  
	public void addObserver(Observer observer) {
		observers.add(observer);
	}
	/** 删除观察者*/  
	public void removeObserver(Observer observer) {
		observers.remove(observer);
	}
	/** 通知所有观察者*/
	public void notifyObservers() {
		for(Observer obs : observers) {
			obs.upadate(this);
		}
	}
	
	public abstract int getNumber();
	public abstract void generate();//产生数字  

}


public class RandomNumberGenerator extends NumberGenerator {
	
	private Random random = new Random();
	private int number;
	public void generate() {
		for(int i = 0; i < 5; i++) {
			number = random.nextInt(10);//产生10以内的随机数  
			notifyObservers();
		}
	}
	
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}

}


public class NumberObserver implements Observer {

	public void upadate(NumberGenerator generator) {
		
		System.out.println("NumberObserver:"+ generator.getNumber());
		try {
			Thread.sleep(1000 * 3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}


public class SymbolObserver implements Observer {

	public void upadate(NumberGenerator generator) {
		
		System.out.print("SymbolObserver:");  
		int count = generator.getNumber();
		for(int i=0; i<count; i++) {
			System.out.print("*^_^*  "); 
		}
		System.out.println("");  
		try {
			Thread.sleep(1000*3);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


public class Client {

	public static void main(String[] args) {
		
		//实例化数字产生对象  
		NumberGenerator generator = new RandomNumberGenerator();  
		//实例化观察者    
		Observer observer1 = new NumberObserver();  
		Observer observer2 = new SymbolObserver();  
		//注册观察者  
		generator.addObserver(observer1);    
		generator.addObserver(observer2);  
		generator.generate(); //产生数字  
		
	}

}


输出结果:

NumberObserver:8
SymbolObserver:*^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^* 
NumberObserver:4
SymbolObserver:*^_^*  *^_^*  *^_^*  *^_^* 
NumberObserver:8
SymbolObserver:*^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^* 
NumberObserver:7
SymbolObserver:*^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^*  *^_^* 
NumberObserver:1
SymbolObserver:*^_^* 

参考:http://blog.csdn.net/csh624366188/article/details/7477116
  • 大小: 31 KB
分享到:
评论

相关推荐

    易学设计模式源码光盘

    "易学设计模式源码光盘" 提供了一种直观的学习方式,帮助初学者更轻松地理解和应用这些模式。这里我们将深入探讨设计模式的核心理念、主要分类以及一些常见设计模式的实现细节。 首先,设计模式的出现源于对软件...

    易学设计模式

    ### 易学设计模式知识点详解 #### 一、设计模式概览 设计模式是一种软件设计中的通用解决方案,它描述了一种在特定情境下用来解决问题的重复出现的设计结构。设计模式可以帮助开发者更好地理解如何构建可扩展、可...

    [源代码] 《易学 设计模式》 随书源代码

    第17章 风吹草动:观察者模式 (Observer) 第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 (ChainofResponsibility) 第21章 独具匠心:命令模式 ...

    java-易学设计模式

    观察者模式(Observer)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新;职责链模式(Chain of Responsibility)避免将处理请求的发送者和接收者耦合在一起...

    设计模式例子文档,简单易学

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    介绍设计模式的代码

    在“易学设计模式代码”这个压缩包中,你将找到这些模式的Java实现示例。通过阅读和分析这些代码,你可以更好地理解每种模式的核心思想,以及如何在实际项目中应用它们。同时,虽然这里的示例是基于Java,但设计模式...

    Java语言写的飞机大战实训代码

    9. **设计模式**:在编写大型游戏时,良好的设计模式如观察者模式(Observer)可用于实现事件驱动,工厂模式(Factory)用于对象的创建,单例模式(Singleton)用于全局资源的管理。 通过这个实训项目,学生不仅能...

    vue-dev.zip

    这背后的技术称为“观察者”(Observer)和“订阅者”(Subscriber)模式,以及“派发器”(Dispatcher)机制,确保了高效的数据更新。 Vue的路由管理器Vue Router是官方推荐的解决方案,用于处理应用程序的页面...

    javascript-2021

    9. **JavaScript设计模式**:单例模式、工厂模式、观察者模式等,理解并运用设计模式可以写出更高质量的代码。 10. **Web API和Web Components**:利用Web API如WebSocket进行实时通信,Web Components则提供了...

    WeatherWear:天气应用

    此外,为了保持代码整洁,可能还采用了设计模式,如工厂模式、观察者模式,以及函数式编程概念。 在测试方面,WeatherWear可能会使用Jest或Mocha这样的JavaScript测试框架,配合Chai或Expect作为断言库,进行单元...

    dotmenu

    7. **设计模式**:为了提高代码的可读性和可维护性,"dotmenu"可能采用了常见的设计模式,如单例模式(Singleton)用于管理全局资源,工厂模式(Factory)用于生成菜单实例,或者观察者模式(Observer)来处理事件。...

    一些前端面试题.pdf

    **Vue.js**:一种轻量级、易学的框架,适用于构建交互式的Web界面。 **Angular**:Google支持的完整的MVC框架,适用于大型企业级应用。 ### HTTP请求的过程 1. **发起请求**:客户端发送HTTP请求至服务器。 2. **...

Global site tag (gtag.js) - Google Analytics