观察者模式(发布订阅模式)
原创
©著作权归作者所有:来自51CTO博客作者1058106015的原创作品,请联系作者获取转载授权,否则将追究法律责任
大体上,分为两个,一个是发布者,另一个是订阅者,也就是publisher以及subscriber,
下面举例为顾客购买衣服,大致流程应该是这样,
顾客消费了一件衣服后,
会计收到付款,然后开具发票,
顾客凭小票去出纳那里将小票给出纳,
出纳登记后快递员送货上门
在这里,顾客担任了发布者(被观察者)这一角色,会计、出纳、快递担任了订阅者(观察者)这一角色
下面是具体的代码实现,由于java.util工具包中已经有了该设计模式的实现,我们只需继承、实现、调用即可
Customer.java
/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer Customer.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Customer extends Observable{
// public Customer(Observer ... observers) {
// if(observers!=null){
// for(Observer o:observers){
// this.addObserver(o);
// }
// }
// }
public Customer build(Observer o){
this.addObserver(o);
return this;
}
public void custom(){
this.setChanged();
this.notifyObservers("已付款");
}
}
Accountant.java
/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer Accountant.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Accountant implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"会计收到了付款,开具发票");
}
}
Cashier.java
/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer Cashier.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Cashier implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"我是出纳员,顾客购买信息登记入账");
}
}
DilliveryMan.java
/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
import java.util.Observable;
import java.util.Observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer DilliveryMan.java Created on
* 2015年7月15日
*
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class DilliveryMan implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg+"我是配送员,准备开始发货");
}
}
Main.java
/*
* 版权信息:北京汉方三陆零科技有限公司</br>
* Copyright ?2014-2015. All rights reserved. 京ICP备15000045号
*/
package com.hanfang360.com.designpattern.observer;
/****************************************************************************
* com.hanfang360.com.designpattern.observer Main.java Created on 2015年7月15日
* @Author: linfenliang
* @Description:
* @Version: 1.0
***************************************************************************/
public class Main {
public static void main(String[] args) {
// Customer customer = new Customer(new DilliveryMan(),new Cashier(),new Accountant());
Customer customer = new Customer().build(new DilliveryMan()).build(new Cashier()).build(new Accountant());
customer.custom();
}
}
观察者模式与发布订阅还是有一定区别的,观察者模式需要一个被观察者,发布订阅模式,可以没有订阅者