java观察者拓展(二)根据观察者的场景需求

观察者模式高级应用。根据场景来做出反应。
比如说老师说今天扫地,但是今天不该小明打扫,所以小明在听到这个后不会有反应,但是小红今天打扫,小红就要去打扫清洁。
根据应用场景的不同需求不同。
具体实现方法,是将 抽象类中的notifyObservers方法放到子类中,然后update是根据匹配通知消息的内容用到判断方法。

根据最开始的架构来看

抽象主题角色(取消了notifyObservers方法)

package com.whoami;
import java.util.ArrayList;
import java.util.List;

/**
*
* @author ZhangYong
*观察者接口,知道观察他的观察者,能够添加观察者和删除观察者
*/
public class Subject {
protected List observers = new ArrayList();
public void add(Observer observer){
observers.add(observer);
}
public void remove(Observer observer){
observers.remove(observer);
}

}


抽象观察角色(多传入了两个方法,用于到时候设置判断)

package com.whoami;
/**
* 观察者接口。
* @author ZhangYong
*
*/
public interface Observer {
/**
* 更新接口
* @param subject
* subject传入目标对象,方便获取状态
*/
public void update(Subject subject);
public void setObserverName(String observerName);
public String getObserverName();
}

具体主题角色(将notifyObservers方法写到了这里,能够判断,根据场景需求推送)

package com.whoami;
/**
* 具体的被观察的观察对象(班主任)
* @author ZhangYong
*
*/
public class SpecificSubject extends Subject {
//目标对象状态
private String subjectState;

public String getSubjectState() {
return subjectState;
}
/**
*
* 班主任发布通知
* @param subjectState
*/
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
this.notifyObservers();
}
protected void notifyObservers(){
for(Observer observer:observers){
if("小明".equals(observer.getObserverName())){
if("打扫".equals(this.getSubjectState())){
observer.update(this);
				}
			}
		}
	}
}

具体观察者角色

package com.whoami;
/**
* 继承观察者接口。具体实现update的方法
* @author ZhangYong
*
*/
public class SpecificObserver implements Observer {
//观察对象通知
private String observerState;
//观察者姓名,标记吧
private String observerName;
//观察者将要做什么,也可以是个方法
private String observerThings;
public String getObserverState() {
return observerState;
}

public void setObserverState(String observerState) {
this.observerState = observerState;
}

public String getObserverName() {
return observerName;
}

public void setObserverName(String observerNae) {
this.observerName = observerNae;
}

public String getObserverThings() {
return observerThings;
}

public void setObserverThings(String observerThings) {
this.observerThings = observerThings;
}

/**
* 接收到通知,响应事件,现在先打印一句话
*/
public void update(Subject subject) {

observerState = ((SpecificSubject)subject).getSubjectState();
System.out.println(observerName+"得到观察对象的通知是:"+observerState+"。即将做出:"+observerThings);
}

}
[/java]
测试类Main
[java]
package com.whoami;
/**
* @author ZhangYong
*测试类
*/
public class Main {
public static void main(String[] args) {
//创建观察者对象
SpecificObserver man1 = new SpecificObserver();
man1.setObserverName("同学A");
man1.setObserverThings("我想看数学");
SpecificObserver man2 = new SpecificObserver();
man2.setObserverName("同学B");
man2.setObserverThings("我想看物理");
SpecificObserver man3 = new SpecificObserver();
man3.setObserverName("同学C");
man3.setObserverThings("想看英语");
//添加对象到集合众
SpecificSubject sub = new SpecificSubject();
sub.add(man1);
sub.add(man2);
sub.add(man3);
//观察对象发布通知,创建目标
sub.setSubjectState("我是班主任,现在上自习你们看自己的");
}
}


结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值