的依赖关系,让多个观察者对象同事监听某一个主题的对象。这个主题对象在状态在发生变化时,会通知所有的观察者对象,让它们能够。
/**
-
@Author: cxh
-
@CreateTime: 18/1/10 09:08
-
@ProjectName: JavaBaseTest
*/
public class Client {
public static void main(String[] args) {
Boss boss=new Boss();
NBAObserver nbaObserver=new NBAObserver("李明浩",boss);
TVObserver tvObserver=new TVObserver("李沁",boss);
//add
boss.add(nbaObserver);
boss.add(tvObserver);
//delete
//boss状态转变,通知观察者
boss.setSubjetctState("领导回来了");
boss.notifyObservers();
}
}
<span style="font-size:14px;">
/**
-
@Author: cxh
-
@CreateTime: 18/1/9 23:29
-
@ProjectName: JavaBaseTest
*/
public abstract class Subject {
abstract void add(Observer observer);
abstract void delete(Observer observer);
abstract void notifyObservers();
private String subjetctState;
//获取主题状态
public String getSubjetctState() {
return subjetctState;
}
//设置主题状态
public void setSubjetctState(String subjetctState) {
this.subjetctState = subjetctState;
}
}
<span style="font-size:14px;">
import java.util.ArrayList;
import java.util.List;
/**
-
@Author: cxh
-
@CreateTime: 18/1/10 09:11
-
@ProjectName: JavaBaseTest
*/
public class Boss extends Subject{
private List list=new ArrayList<>();
//增加观察者
public void add(Observer observer){
list.add(observer);
}
//删除观察者
public void delete(Observer observer){
list.remove(observer);
}
//通知
public void notifyObservers(){
for(Observer s:list)
s.update();
}
}
<span style="font-size:14px;">
/**
- @Author: cxh
- @CreateTime: 18/1/9 23:17
- @ProjectName: JavaBaseTest
*/
public interface Observer {
void update();
}
<span style="font-size:14px;">
/**
-
@Author: cxh
-
@CreateTime: 18/1/9 23:28
-
@ProjectName: JavaBaseTest
*/
public class NBAObserver implements Observer {
private Subject subject;//关注主题
private String name;//观察者名字
public NBAObserver(String name,Subject subject){//参数Subject体现了:具体依赖抽象原则
this.name=name;
this.subject=subject;
}
@Override
public void update() {
System.out.println(subject.getSubjetctState()+","+name+","+"快继续工作~");
}
}
<span style="font-size:14px;">
/**
-
@Author: cxh
-
@CreateTime: 18/1/9 23:45
-
@ProjectName: JavaBaseTest
*/
public class TVObserver implements Observer {
private String name;//看电视的人名字
private Boss subject;//主题
public TVObserver(String name,Boss subject){
this.name=name;
this.subject=subject;
}
@Override
public void update() {
System.out.println(subject.getSubjetctState()+","+"快继续工作~");
}
}
<span style="font-size:14px;">
输出:
Process finished with exit code 0
<span style="font-size:14px;">
import java.util.Date;
/**
-
@Author: cxh
-
@CreateTime: 18/1/12 16:40
-
@ProjectName: JavaBaseTest
*/
public class Client {
public static void main(String[] args) {
//观察者. 创建时起,开始做自己的事情
NBAObserver nbaObserver=new NBAObserver();
TVObserver tvObserver=new TVObserver();
//主题(通知者)
NotifierA notifierA=new NotifierA();
//为主题添加观察者
notifierA.addListener(nbaObserver,"stopWatchingNBA",new Date());
notifierA.addListener(tvObserver,"stopWatchingTV",new Date());
//主题状态改变,通知观察者
notifierA.notifyX();
}
}
<span style="font-size:14px;">
import java.lang.reflect.Method;
/**
-
@Author: cxh
-
@CreateTime: 18/1/10 23:29
-
@ProjectName: JavaBaseTest
*/
public class Event{
//要执行方法的对象
private Object object;
//要执行的方法名称
private String methodName;
//要执行方法的参数
private Object[] params;
//要执行方法的参数类型
private Class[] paramType;
//两个构造函数
public Event(){}
public Event(Object object,String methodName,Object... args){
this.object=object;
this.methodName=methodName;
this.params=args;
//获取参数类型
getParaTypes(args);
}
private void getParaTypes(Object[] params){
int size=params.length;
this.paramType=new Class[size];//4个私有变量,只有这个变量实现了深拷贝
for(int i=0;i<size;i++)
paramType[i]=params[i].getClass();
}
//执行该对象的方法
public void invoke() throws Exception{
Method method=object.getClass().getMethod(getMethodName(),getParamType());
if(null==method)
return;
method.invoke(getObject(),getParams());
}
//get,set方法
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Object[] getParams() {
return params;
}
public void setParams(Object[] params) {
this.params = params;
}
public Class[] getParamType() {
return paramType;
}
public void setParamType(Class[] paramType) {
this.paramType = paramType;
}
}
<span style="font-size:14px;">
import java.util.ArrayList;
import java.util.List;
/**
-
@Author: cxh
-
@CreateTime: 18/1/12 11:23
-
@ProjectName: JavaBaseTest
*/
public class EventHandler {
//保存了很多event的引用
private List objects;
public EventHandler(){
objects=new ArrayList<>();
}
//添加某个event
public void addEvent(Object object,String name,Object... args){
objects.add(new Event(object,name,args));
}
//触发所有引用的event
public void notifyEvents() throws Exception{
for(Event e:objects)
e.invoke();
}
}
<span style="font-size:14px;">
import java.util.Date;
/**
- @Author: cxh
- @CreateTime: 18/1/12 16:30
- @ProjectName: JavaBaseTest
*/
public class NBAObserver{
public NBAObserver(){
System.out.println("正在观看NBA比赛!当前时间为:"+new Date());
}
public void stopWatchingNBA(Date date){
System.out.println("领导回来了,快关闭NBA赛事直播!当前时间为:"+date);
}
}
<span style="font-size:14px;">
import java.util.Date;
/**
- @Author: cxh
- @CreateTime: 18/1/12 16:37
- @ProjectName: JavaBaseTest
*/
public class TVObserver {
public TVObserver(){
System.out.println("正在观看电视剧<<甄嬛传>>,当前时间为:"+new Date());
}
public void stopWatchingTV(Date date){
System.out.println("领导回来了,快关闭电视剧播放.当前时间为:"+date);
}
}
<span style="font-size:14px;">
/**
-
@Author: cxh
-
@CreateTime: 18/1/12 11:36
-
@ProjectName: JavaBaseTest
*/
public abstract class Notifier {
private EventHandler eventHandler=new EventHandler();
//增加需要帮忙放哨的同事
public abstract void addListener(Object object,Object... args);
//告诉所有需要帮忙放哨的同事:领导回来啦
public abstract void notifyX();
//get,set
public EventHandler getEventHandler() {
return eventHandler;
}
public void setEventHandler(EventHandler eventHandler) {
this.eventHandler = eventHandler;
}
}
<span style="font-size:14px;">
/**
-
@Author: cxh
-
@CreateTime: 18/1/12 16:13
-
@ProjectName: JavaBaseTest
*/
public class NotifierA extends Notifier{
@Override
public void addListener(Object object,Object... args) {
getEventHandler().addEvent(object,args);
}
@Override
public void notifyX(){
try{
getEventHandler().notifyEvents();
}catch (Exception e){
System.out.println("通知同事时出错!!!");
}
}
}
<span style="font-size:14px;">
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。