观察者模式(发布订阅模式)

很多设计模式都用过,或者在别人的代码中看到过或者在开源框架中看到过,可是就是不知道是什么设计模式啊,自己也不清楚叫什么名字,这次总结下观察者模式(我自己只知道叫发布订阅模式,惭愧)

观察者模式(发布订阅模式) - 断鸿零雁 - 断情阁
 

大体上,分为两个,一个是发布者,另一个是订阅者,也就是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();

}

}



                                                                                                                                                   
观察者模式与发布订阅还是有一定区别的,观察者模式需要一个被观察者,发布订阅模式,可以没有订阅者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值