设计模式----观察者模式(observer)


这里采用两种方式实现观察者模式:第一种方式为完全自己写,第二种方式为实现JDK

的Observable和Observer接口


第一种方式:

Observer.java代码如下:

package com.designPattern.abserver;

public interface Observer {

public void update(String context);

}



LiSi.java代码如下:

package com.designPattern.abserver;

public class LiSi implements Observer{

@Override
public void update(String context) {
System.out.println("李斯:观察到韩非子的活动了,开始向老板汇报!");
this.report(context);
System.out.println("李斯:汇报完毕!");
}

private void report(String reportContext){
System.out.println("李斯:报告秦始皇,李斯有活动:"+reportContext);
}

}



LiuSi.java代码如下:

package com.designPattern.abserver;

public class LiuSi implements Observer{

@Override
public void update(String context) {
System.out.println("刘斯:观察到韩非子活动!");
this.happy(context);
System.out.println("刘斯:真被乐死了!");
}

private void happy(String context){
System.out.println("刘斯:因为"+context+",--所以我很快乐!");
}
}



WangSi.java代码如下:

package com.designPattern.abserver;

public class WangSi implements Observer{

@Override
public void update(String context) {
System.out.println("王斯:观察到韩非子活动!");
this.cry(context);
System.out.println("王斯:真真的哭死了!");
}

private void cry(String context){
System.out.println("王斯:因为"+context+"---所以悲伤!");
}

}



Observable.java代码如下:

package com.designPattern.abserver;

/**
*
* @author yangjianzhou
* 所有被观察者
*/
public interface Observable {

public void addObserver(Observer observer);

public void deleteObserver(Observer observer);

public void notifyObservers(String context);
}



HanFeiZi.java代码如下:

package com.designPattern.abserver;

import java.util.ArrayList;

public class HanFeiZi implements Observable{

private ArrayList<Observer> observerList = new ArrayList<Observer>();

@Override
public void addObserver(Observer observer) {
this.observerList.add(observer);

}

@Override
public void deleteObserver(Observer observer) {
this.observerList.remove(observer);

}

@Override
public void notifyObservers(String context) {
for(Observer observer:observerList){
observer.update(context);
}

}

public void haveBreakfast(){
System.out.println("韩非子:开始吃饭了。。。");
this.notifyObservers("韩非子正在吃饭");
}

public void haveFun(){
System.out.println("韩非子正在娱乐!");
this.notifyObservers("韩非子正在娱乐");
}


}



Client.java代码如下:

package com.designPattern.abserver;

public class Client {

public static void main(String[] args) {

Observer liSi = new LiSi();
Observer wangSi = new WangSi();
Observer liuSi = new LiuSi();

HanFeiZi hanFeiZi = new HanFeiZi();
hanFeiZi.addObserver(liSi);
hanFeiZi.addObserver(wangSi);
hanFeiZi.addObserver(liuSi);

hanFeiZi.haveBreakfast();

}

}



运行结果如下:

韩非子:开始吃饭了。。。
李斯:观察到韩非子的活动了,开始向老板汇报!
李斯:报告秦始皇,李斯有活动:韩非子正在吃饭
李斯:汇报完毕!
王斯:观察到韩非子活动!
王斯:因为韩非子正在吃饭---所以悲伤!
王斯:真真的哭死了!
刘斯:观察到韩非子活动!
刘斯:因为韩非子正在吃饭,--所以我很快乐!
刘斯:真被乐死了!


第二种方式:

LiSi.java 代码如下:

package com.designPattern.abserverAPI;

import java.util.Observable;
import java.util.Observer;

public class LiSi implements Observer{

@Override
public void update(Observable observable, Object obj) {
System.out.println("李斯:观察到韩非子的活动了,开始向老板汇报!");
this.report(obj.toString());
System.out.println("李斯:汇报完毕!");
}

private void report(String reportContext){
System.out.println("李斯:报告秦始皇,李斯有活动:"+reportContext);
}

}



LiuSi.java代码如下:

package com.designPattern.abserverAPI;

import java.util.Observable;
import java.util.Observer;

public class LiuSi implements Observer{

@Override
public void update(Observable observable, Object obj) {
System.out.println("刘斯:观察到韩非子活动!");
this.happy(obj.toString());
System.out.println("刘斯:真被乐死了!");
}

private void happy(String context){
System.out.println("刘斯:因为"+context+",--所以我很快乐!");
}
}



WangSi.java代码如下:

package com.designPattern.abserverAPI;

import java.util.Observable;
import java.util.Observer;

public class WangSi implements Observer{

@Override
public void update(Observable observable, Object obj) {
System.out.println("王斯:观察到韩非子活动!");
this.cry(obj.toString());
System.out.println("王斯:真真的哭死了!");
}

private void cry(String context){
System.out.println("王斯:因为"+context+"---所以悲伤!");
}
}



HanFeiZi.java代码如下:

package com.designPattern.abserverAPI;

import java.util.Observable;

/**
*
* @author yangjianzhou
* 使用JDK自带的Observable类
*/
public class HanFeiZi extends Observable{

public void haveBreakfast(){
System.out.println("韩非子:开始吃饭了。。。");
super.setChanged();
super.notifyObservers("韩非子正在吃饭");
}

public void haveFun(){
System.out.println("韩非子正在娱乐!");
super.setChanged();
super.notifyObservers("韩非子正在娱乐");
}

}



Client.java代码如下:

package com.designPattern.abserverAPI;

import com.designPattern.abserver.HanFeiZi;
import com.designPattern.abserver.LiSi;
import com.designPattern.abserver.LiuSi;
import com.designPattern.abserver.Observer;
import com.designPattern.abserver.WangSi;

public class Client {

public static void main(String[] args) {

Observer liSi = new LiSi();
Observer wangSi = new WangSi();
Observer liuSi = new LiuSi();

HanFeiZi hanFeiZi = new HanFeiZi();
hanFeiZi.addObserver(liSi);
hanFeiZi.addObserver(wangSi);
hanFeiZi.addObserver(liuSi);

hanFeiZi.haveBreakfast();
}
}



运行结果如下:

韩非子:开始吃饭了。。。
李斯:观察到韩非子的活动了,开始向老板汇报!
李斯:报告秦始皇,李斯有活动:韩非子正在吃饭
李斯:汇报完毕!
王斯:观察到韩非子活动!
王斯:因为韩非子正在吃饭---所以悲伤!
王斯:真真的哭死了!
刘斯:观察到韩非子活动!
刘斯:因为韩非子正在吃饭,--所以我很快乐!
刘斯:真被乐死了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值