>此博客第一篇个人文章,就从设计模式入手吧
对于观察者模式,有时候在很多框架中也成为监听模式,本质上是一个事件驱动模式的应用。在很多互联网的文章中将其说得特别复杂,弄得云里雾里,看完以后完全记不住,只是内心佩服作者的牛逼。
对于观察者模式,主要有2个角色:主题(被监控者)和事件(监控者),将对应的事件绑定到主题,当主题更新的时候通知事件,让事件进行相应的动作。
##应用场景
事件驱动类型的,比如邮件通知、短信通知、消息订阅等,这种模式比较常用,但是通常框架都有一些自己的实现,程序员只需要继承或者实现对应的类即可。
**talk is cheap,show me code!**
## 代码段
### 1.首先定义主题接口
interface issue{
public void removed(event e);
public void add(event e);
public void notifyWatcher();
}
### 2.定义事件接口
interface event{
public void update();
}
### 3.定义具体的主题接口
public class concreteIssue implements issue{
private List<event> les = new ArrayList<event>();
@overide
public void addEvent(event e){
le.add(e);
}
@oveide
public void removeEvent(event e){
le.remove(e);
}
@overide
public void notify(){
for(event le:les){
le.update();
}
}
}
### 4.定义具体的事件
public class concreteEvent implements event{
public string name;
public concreteEvent(string name){
this.name = name;
}
@overide
public void update(){
system.out.println("Event name"+this.name+"is update things");
}
}
## 演示
至此,我们已经完成了所有的代码编写。我们可以使用一个类来测试一下。
class demo{
public staic void main(stirng[] args){
concreteIssue cI1 = new concreteIssue();
concreteEvent ce1= new concreteEvent("event1");
concreteEvent ce2= new concreteEvent("event2");
cI1.add(ce1);
cI1.add(ce2);
cI1.notifyWatcher();
//remove one event
System.out.println("------remove on event2----");
cI1.removeEvent(ce2);
cI1.notifyWatcher();
}
}
在DIEA上运行结果是:
Event name :event1is update things
Event name :event2is update things
------remove on event2----
Event name :event1is update things
在java 官方有已经实现好的该模式,只需要实现一下对应接口即可完成功能。我们希望能够从原理层去理解。
>虽然这是在该博客写的第一篇关于设计模式的文章,但是过去不断的去读设计模式的东西,也在laravel框架中实践一些具体的应用(邮件通知、短信通知等),但是真正说这是一个模式,其实多少有些抵触,毕竟这是自然而然解决问题的方式。
>设计模式,当你看完这么多模式(21种貌似),你会发现很多问题就是通过抽象、分层的方法来完成必要的松耦合,对于很少从系统角度考虑问题的程序员来说确实不需要过多了解设计模式,但是从一个架构师或者是设计师的角度来说,却是很必要了解的。本人当初面试进入公司时候,面试官让我现场写出单例模式,我没有写出来,但是我告诉面试官单例的原理无非就是通过类的静态属性,当初次加载类时就已经完成初始化,而不再需要new,从而保证唯一性。
对于观察者模式,有时候在很多框架中也成为监听模式,本质上是一个事件驱动模式的应用。在很多互联网的文章中将其说得特别复杂,弄得云里雾里,看完以后完全记不住,只是内心佩服作者的牛逼。
对于观察者模式,主要有2个角色:主题(被监控者)和事件(监控者),将对应的事件绑定到主题,当主题更新的时候通知事件,让事件进行相应的动作。
##应用场景
事件驱动类型的,比如邮件通知、短信通知、消息订阅等,这种模式比较常用,但是通常框架都有一些自己的实现,程序员只需要继承或者实现对应的类即可。
**talk is cheap,show me code!**
## 代码段
### 1.首先定义主题接口
interface issue{
public void removed(event e);
public void add(event e);
public void notifyWatcher();
}
### 2.定义事件接口
interface event{
public void update();
}
### 3.定义具体的主题接口
public class concreteIssue implements issue{
private List<event> les = new ArrayList<event>();
@overide
public void addEvent(event e){
le.add(e);
}
@oveide
public void removeEvent(event e){
le.remove(e);
}
@overide
public void notify(){
for(event le:les){
le.update();
}
}
}
### 4.定义具体的事件
public class concreteEvent implements event{
public string name;
public concreteEvent(string name){
this.name = name;
}
@overide
public void update(){
system.out.println("Event name"+this.name+"is update things");
}
}
## 演示
至此,我们已经完成了所有的代码编写。我们可以使用一个类来测试一下。
class demo{
public staic void main(stirng[] args){
concreteIssue cI1 = new concreteIssue();
concreteEvent ce1= new concreteEvent("event1");
concreteEvent ce2= new concreteEvent("event2");
cI1.add(ce1);
cI1.add(ce2);
cI1.notifyWatcher();
//remove one event
System.out.println("------remove on event2----");
cI1.removeEvent(ce2);
cI1.notifyWatcher();
}
}
在DIEA上运行结果是:
Event name :event1is update things
Event name :event2is update things
------remove on event2----
Event name :event1is update things
在java 官方有已经实现好的该模式,只需要实现一下对应接口即可完成功能。我们希望能够从原理层去理解。
>虽然这是在该博客写的第一篇关于设计模式的文章,但是过去不断的去读设计模式的东西,也在laravel框架中实践一些具体的应用(邮件通知、短信通知等),但是真正说这是一个模式,其实多少有些抵触,毕竟这是自然而然解决问题的方式。
>设计模式,当你看完这么多模式(21种貌似),你会发现很多问题就是通过抽象、分层的方法来完成必要的松耦合,对于很少从系统角度考虑问题的程序员来说确实不需要过多了解设计模式,但是从一个架构师或者是设计师的角度来说,却是很必要了解的。本人当初面试进入公司时候,面试官让我现场写出单例模式,我没有写出来,但是我告诉面试官单例的原理无非就是通过类的静态属性,当初次加载类时就已经完成初始化,而不再需要new,从而保证唯一性。
本文深入浅出地介绍了观察者模式的基本概念与实现方式,并通过一个简单的Java代码示例展示了其工作流程。适用于初学者理解事件驱动的设计模式。
354

被折叠的 条评论
为什么被折叠?



