private static GPer gper = null;
private GPer(){}
public static GPer getInstance(){
if(null == gper){
gper = new GPer();
}
return gper;
}
public String getName() {
return name;
}
public void publishQuestion(Question question){
System.out.println(question.getUserName() + “在” + this.name + “上提交了一个问题。”);
setChanged();
notifyObservers(question);
}
}
然后创建问题Question类。
public class Question {
private String userName;
private String content;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
接着创建老师Teacher类。
public class Teacher implements Observer {
private String name;
public Teacher(String name) {
this.name = name;
}
public void update(Observable o, Object arg) {
GPer gper = (GPer)o;
Question question = (Question)arg;
System.out.println(“======================”);
System.out.println(name + “老师,你好!\n” +
“您收到了一个来自” + gper.getName() + “的提问,希望您解答。问题内容如下:\n” +
question.getContent() + “\n” + “提问者:” + question.getUserName());
}
}
最后编写客户端测试代码。
public static void main(String[] args) {
GPer gper = GPer.getInstance();
Teacher tom = new Teacher(“Tom”);
Teacher jerry = new Teacher(“Jerry”);
gper.addObserver(tom);
gper.addObserver(jerry);
//用户行为
Question question = new Question();
question.setUserName(“张三”);
question.setContent(“观察者模式适用于哪些场景?”);
gper.publishQuestion(question);
}
运行结果如下图所示。
笔者向大家推荐一个实现观察者模式的非常好用的框架,API使用也非常简单,举个例子,首先引入Maven依赖包。
com.google.guava
guava
20.0
然后创建侦听事件GuavaEvent。
/**
- Created by Tom
*/
public class GuavaEvent {
@Subscribe
public void subscribe(String str){
//业务逻辑
System.out.println(“执行subscribe方法,传入的参数是:” + str);
}
}
最后编写客户端测试代码。
/**
- Created by Tom
*/
public class GuavaEventTest {
public static void main(String[] args) {
EventBus eventbus = new EventBus();
GuavaEvent guavaEvent = new GuavaEvent();
eventbus.register(guavaEvent);
eventbus.post(“Tom”);
}
}
再来设计一个业务场景,帮助小伙伴们更好地理解观察者模式。在JDK源码中,观察者模式的应用也非常多。例如java.awt.Event就是观察者模式的一种,只不过Java很少被用来写桌面程序。我们用代码来实现一下,以帮助小伙伴们更深刻地了解观察者模式的实现原理。首先,创建EventListener接口。
/**
-
观察者抽象
-
Created by Tom.
*/
public interface EventListener {
}
创建Event类。
/**
-
标准事件源格式的定义
-
Created by Tom.
*/
public class Event {
//事件源,动作是由谁发出的
private Object source;
//事件触发,要通知谁(观察者)
private EventListener target;
//观察者的回应
private Method callback;
//事件的名称
private String trigger;
//事件的触发事件
private long time;
public Event(EventListener target, Method callback) {
this.target = target;
this.callback = callback;
}
public Object getSource() {
return source;
}
public Event setSource(Object source) {
this.source = source;
return this;
}
public String getTrigger() {
return trigger;
}
public Event setTrigger(String trigger) {
this.trigger = trigger;
return this;
}
public long getTime() {
return time;
}
public Event setTime(long time) {
this.time = time;
return this;
}
public Method getCallback() {
return callback;
}
public EventListener getTarget() {
return target;
}
@Override
public String toString() {
return “Event{” +
“source=” + source +
“, target=” + target +
“, callback=” + callback +
“, trigger='” + trigger + ‘’’ +
“, time=” + time +
‘}’;
}
}
创建EventContext类。
/**
-
被观察者的抽象
-
Created by Tom.
*/
public abstract class EventContext {
protected Map<String,Event> events = new HashMap<String,Event>();
public void addListener(String eventType, EventListener target, Method callback){
events.put(eventType,new Event(target,callback));
}
public void addListener(String eventType, EventListener target){
try {
this.addListener(eventType, target,
target.getClass().getMethod(“on”+toUpperFirstCase(eventType), Event.class));
}catch (NoSuchMethodException e){
return;
}
}
private String toUpperFirstCase(String eventType) {
char [] chars = eventType.toCharArray();
chars[0] -= 32;
return String.valueOf(chars);
}
private void trigger(Event event){
event.setSource(this);
event.setTime(System.currentTimeMillis());
try {
if (event.getCallback() != null) {
//用反射调用回调函数
event.getCallback().invoke(event.getTarget(), event);
}
}catch (Exception e){
e.printStackTrace();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/a71b24d4f48089f79d67ed5fbb9cc988.jpeg)
最后
小编精心为大家准备了一手资料
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
BATJ面试要点及Java架构师进阶资料
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
码获取!!(备注Java获取)**
![img](https://i-blog.csdnimg.cn/blog_migrate/a71b24d4f48089f79d67ed5fbb9cc988.jpeg)
最后
小编精心为大家准备了一手资料
[外链图片转存中…(img-2wuZHKF2-1712418537961)]
[外链图片转存中…(img-qqk5Vbl2-1712418537961)]
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
[外链图片转存中…(img-fDQrD8ue-1712418537961)]
BATJ面试要点及Java架构师进阶资料
[外链图片转存中…(img-zlsE1G4v-1712418537962)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!