观察者模式

概念:

脑海里想象为个人手机订阅的新闻,只有新闻软件有重大的更新则会推送到你的手机上。


考虑如下场景:

系统每次生成一个工单,需要同步数据给CRM和HB,当然对于这两个系统的各自关系的东西是不一样的,则抽象出如下:

MessageSender(订阅者/消息发送者),CRMObserver(CRM的接收者),HBObserver(HB的接收者)


public abstract class SystemInterface {
	/**
	 * 观察者列表
	 */
	private  List<Observer> observerList = new ArrayList<Observer>();
	
	/**
	 * 登记观察者
	 * @param observer
	 */
	public void attach(Observer observer){     
		observerList.add(observer);
        System.out.println("add an observer");
    }
	
	/**
     * 删除观察者对象
     * @param observer    观察者对象
     */
    public void detach(Observer observer){
    	observerList.remove(observer);
    	System.out.println("delete an observer");
    }
    
    /**
     * 通知所有注册的观察者对象
     */
    public void nodifyObservers(String newState){
        
        for(Observer observer : observerList){
            observer.update(newState);
        }
    }
	
    /**
     * 通知完毕后变更状态
     * @param newState
     */
    public abstract void change(String newState);
}

public class MessageSender extends SystemInterface {
	private String state;
    
    public String getState() {
        return state;
    }
    
    public void change(String newState){
        state = newState;
        System.out.println("主题状态为:" + state);
        //状态发生改变,通知各个观察者
        this.nodifyObservers(state);
    }
}

public interface Observer {
	/**
	 * 更新的状态
	 * @param state
	 */
	public void update(String state);
}

public class CRMObserver implements Observer {
	
	//观察者的状态
    private String observerState;

	@Override
	public void update(String state) {
		/**
         * 更新观察者的状态,使其与目标的状态保持一致
         */
        observerState = state;
        System.out.println("CRM收到状态为:"+observerState);

	}

}

public class HBObserver implements Observer {
	private String observerState;
	@Override
	public void update(String state) {

		observerState = state;
        System.out.println("HB收到状态为:"+observerState);
	}

}

public class Client {

	/**
	 * @param args
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		String[] observersArray = new String[]{
				"study.CRMObserver",
				"study.HBObserver"
		};
		
		Class<?>[] observerClass = new Class<?>[observersArray.length];
		
		for (int i = 0; i < observerClass.length; i++) {
			try {
				observerClass[i] = Class.forName(observersArray[i]);
			} catch (ClassNotFoundException e) {
				System.out.println("类没找到" + observersArray[i]);
				e.printStackTrace();
			}
		}
		
		//创建主题对象
		SystemInterface msgSender = new MessageSender();
		for(Class<?> observer : observerClass){
			//将观察者对象登记到主题对象上
	        msgSender.attach((Observer)observer.newInstance());
		}
        
        //改变主题对象的状态
        msgSender.change("new state");
	}

}

消息转发类注册了CRM和HB的观察者,调用change的时候传入处理的状态,或者说应该这个状态而导致了消息转发类去通知了CRM和HB,在change方法中通知了所有的注册者,消息得以转发。


结果:

add an observer
add an observer
主题状态为:new state
CRM收到状态为:new state
HB收到状态为:new state

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值