Java实现设计模式之观察者模式


观察者

1.      观察者模式(发布-订阅Publish/Subscribe):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

2.      将一个系统分割成一系列互相协作的类,有一个缺点:需要维护相关对象间的一致性。紧密的耦合会给维护和扩展带来不便。观察者模式就是为了解耦而诞生的,让原本一个对象依赖另一个对象的关系,变成了两方都依赖于抽象,而不再依赖于具体,从而使得各自的变化都不会影响另一边的变化。

3.      初级的观察者模式,由于“通知者”依赖“观察者”,不够好。所以升级的方法叫“委托”。

4.       委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。一个委托可以搭载多个方法,所有方法被依次唤醒,最重要的是,委托对象所搭载的方法并不需要属于同一个类。委托对象所搭载的所有方法必须具有相同的圆形和形式,也就是拥有相同的参数列表和返回值类型.



/**
 * 《大话设计模式》14章————老板回来,我不知道【观察者模式】
 */


import java.util.ArrayList;
import java.util.Iterator;


/** 
*  @author   LilyLee
 * @date     2017年6月1日
 * @time     上午8:08:09
 * @Version  1.0
 * @email    lilylee_1213@foxmail.com
 *
 */
public class ObserverTest {

	public static void main(String[] args) {
		ConcreteSubject cs=new ConcreteSubject();
		//增加观察者
		cs.Attach(new ConcreteObserver(cs,"Lily"));
		cs.Attach(new ConcreteObserver(cs,"Dianer"));
		cs.Attach(new ConcreteObserver(cs,"老张"));
		
		cs.setSujstate("老板来了!赶紧跑!");
		cs.Notify();
		
		
		

	}
}

	//Subject是抽象通知者,把所有对观察者对象的引用保存在一个聚集里。
	//抽象提供接口,可以增加和删除观察者对象
	abstract class Subject{
		private ArrayList<Observer> obs=new ArrayList<Observer>();
		//增加观察者
		public void Attach(Observer ods){
			obs.add(ods);
		}
		//移除观察者
		public void Detach(Observer ods){
			obs.remove(ods);
		}
		//通知观察者
		public void Notify(){
			for(int i=0;i<obs.size();i++){
				obs.get(i).Update();
			}
		}
		
	}
	
	//Observer类,抽象观察者类,定义一个通知更新的接口,得到通知后更新自己。
	abstract class Observer{
		public abstract void Update();
	}
	
	
	
	//ConcreteSubject,具体通知者
	class ConcreteSubject extends Subject{
		private String sujstate;

		
		public String getSujstate() {
			return sujstate;
		}

		public void setSujstate(String sujstate) {
			this.sujstate = sujstate;
		}
		
	}
	
	//ConcreteObserver类,具体观察者,实现抽象观察者角色要求的更新。
	class ConcreteObserver extends Observer{
		private String name;
		private String obsstate;
		private ConcreteSubject subject;
		
		
		public ConcreteSubject getSubject() {
			return subject;
		}

		public void setSubject(ConcreteSubject subject) {
			this.subject = subject;
		}

		public ConcreteObserver(ConcreteSubject subject,String name){
			this.subject=subject;
			this.name=name;
		}
		
		@Override
		public void Update() {
			obsstate=subject.getSujstate();
			System.out.println("观察者   "+name+"  的新状态是 "+obsstate);			
		}
		
		
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值