`

易学设计模式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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics