技术标签: javaEE互联网轻量级开发笔记 java 观察者模式 后端 设计模式 开发语言
观察者模式又称为发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发生变化时,会通知所有观察者,并让其自动更新自已。
看上面那些可能不太容易理解,简单举个例子,假如有一个产品列表,当这个产品列表更新的时候就会同步到一些电商平台,最简单的可能会用if进行判断,当产品列表更新就同步,例如下图:
按照这种方法,如果还有其他电商合作,那么还要继续在if语句里增加逻辑。首先,如果多达数百家电商,那么if的逻辑就异常复杂了。如果推送商品给淘宝发生异常,需要捕捉异常,避免影响之后的电商接口,导致其不能往下进行,这样代码耦合就会增多,同时也不利于维护和扩展
在现实中对开发团队而言,可能产品库是产品团队维护,而合作的电商又是电商团队在维护,这样两个团队之间又要维护同一段代码,显然会造成责任不清的问题。
它更容易扩展,责任更加清晰,我们把电商看成是一个观察者而产品列表就是被观察者对象(被观察者),每一个观察者都可以观察到被观察者,当产品列表更新就会触发各个电商接口发送新产品到合作电商
这种一个或者多个对象(电商接口)去监视另一个对象(产品列表)就被称为观察者模式
观察者模式要同时存在观察者和被观察者双方,观察者可以是多个,
被观察者需要继承java.util.Observable类
package observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class ProductList extends Observable {
private List<String>productList =null;//产品列表
private static ProductList instance=null;//类唯一实例
private ProductList(){};//构建方法私有化
//取唯一实例
public static ProductList getInstance(){
if (instance==null){
instance=new ProductList();
instance.productList=new ArrayList<>();
}
return instance;
}
/**
* 增加观察者对象(电商接口)
* observer观察者
*/
public void addProductListObservable(Observer observer){
this.addObserver(observer);
}
/**
* 增加商品
* newProduct新产品
*/
public void addNewProduct(String newProduct){
productList.add(newProduct);
System.out.println("增加新产品");
this.setChanged();//设置被观察者(产品列表)发生变化
this.notifyObservers(newProduct);//通知电商接口(观察者)发生变化
}
}
构建方法私有化,避免通过new的方式创建对象,而是通过getInstance方法获得产品列表单例,这里使用的是单例模式。
addProductListObserver可以增加一个电商接口(观察者)。
核心逻辑在 addProduct 方法上。在产品列表上增加了一个新的产品,然后调用setChanged方法。这个方法用于告知观察者当前被观察者发生了变化,如果没有,则无法触发其行为。最后通过notifyObservers告知观察者,让它们发生相应的动作,并将新产品作为参数传递给观察者。
观察者需要实现java.util.Observer接口的update方法,如下代码:
package observer;
import java.util.Observable;
import java.util.Observer;
public class JingDongObserver implements Observer {
ProductList productList=ProductList.getInstance();
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("增加新产品同步到京东"+product);
}
}
package observer;
import java.util.Observable;
import java.util.Observer;
public class TaoBaoObserver implements Observer {
@Override
public void update(Observable o, Object product) {
String newProduct=(String)product;
System.out.println("发布新产品同步到淘宝"+product);
}
}
开启测试:
package observer;
import java.util.Observable;
import java.util.Observer;
public class ObserverTest {
public static void main(String[] args) {
ProductList productList=ProductList.getInstance();//获得被观察者唯一对象
JingDongObserver jingDongObserver=new JingDongObserver();
TaoBaoObserver taoBaoObserver=new TaoBaoObserver();
productList.addObserver(taoBaoObserver);//addObserver被观察者(产品列表)注册观察者
productList.addObserver(jingDongObserver);
productList.addNewProduct("新增产品");
}
}
重点是被观察者(产品列表)需要注册到观察者,这样观察者才能观察到被观察者
productList.addObserver(taoBaoObserver);
//addObserver被观察者(产品列表)注册观察者
productList.addObserver(jingDongObserver);
输出结果如下:
增加新产品
增加新产品同步到京东新增产品
发布新产品同步到淘宝新增产品
5 physicalsocketserver physicalsocketserver.h/physicalsocketserver.cc文件实现了一个基本的多路信号分离器。这个多路信号分离器的实现代码可以横跨Windows、Linux、OSX、Android、ios等平台,非常复杂。其实在/trunk/talk/base目录下,还有多个SocketServer的实现,从这些SocketS
先插一张图片 先解释一个函数 void gluLookAt(…) 里面记录三个位置,你的脑袋的位置,你看到的那一个物体的位置,你脑袋的朝向 函数干嘛的?你猜猜.当然是想把你看到的东西显示出来呀.
选择篇1 选择单元格 //选择一个单元格range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE); //选择多个单元格range.AttachDispatch(sheet.GetRange(COleVariant
XSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//垂直
GroupBox(框架)控件是C#中用来组织其他控件形成一个控件组,它的使用方法为【工具箱】-》【所有Windows窗体】(或者是【容器】列表中)-》【GroupBox】,拖拽到窗体界面中,再将其他控件拖拽到GroupBox中就可以形成一个控件组。当框架移动时,该控件组同时移动,不会产生其他的位移,所以是组织界面的好东西。它主要有两个属性:Text和Visible。Text属性代表Grou
正像夏季的阳光、海水、沙滩一样,冬季,雪原、滑雪、泡泉为出游最佳享受。你去过真正的雪乡吗?那一片纯白世界,美得让人心颤,而飞驰在雪原,感觉绝对酷毙了,像鸟一样轻盈、自由,其中的开心,非亲临者无法体会。 ...
生活中,我们不伐有一些很简单的问题,但是这些简单的问题却含有复杂的解释过程,比如一张普通的A4纸,最多可以叠多少次?没有实践过的人会轻而易举的回答,叠很多次,其实不然,一张普通的A4纸最多可以叠8次,若是不信,可以自己去对叠一下。那么为什么一张纸最多只能叠8次,这其中含有一定的数学公式,假设纸为正方形,边长为a,厚度为h,当折叠一次的时候,折叠边长不变,厚度为2倍的h,折叠两次的时候,折叠边长为原...
Windows10 无法打开.exe可执行文件的解决方法问题描述: 刚刚因为好奇使用福昕PDF编辑器打开.caj文件,但是一打开发现我好像中毒了,这边福昕不断的自动开启,而且可以看到我电脑上的应用都变成了福昕编辑器的图标。然后我还以为是系统出问题了,接着就是重启,但是重启之后发现,系统并没有恢复正常,福昕不但没有停止打开,而且比之前打开的更加多了,基于这个情况,我尝试打开其他软件,但是我发现双击...
<el-upload class="avatar-uploader" accept="image/*" :http-request="(param) => uploadImage(param)" action="~~" :limit="1" ref="coverPicUpload" :show-file-list="false" :before-upload="beforeUpload"> <el-image style="width:.
相信抓包是程序员,运维工程师,架构师,都必不可少的一项技能。但是能够深入掌握好这门技艺的人,确实需要有开发,网络,运维,架构等"跨界”背景才能比较好的发挥抓包神技的威力。本文是纯干货,重点不在于理论,更注重实战技能,尤其注重对抓包数据的分析。本文中的命令追求的是使用最简单,最普及的Linux系统自带工具包实现各种抓包分析,具有尽可能广泛的移植性和可用性。文中给出的命令均在Centos 6.3,tc...
关于web.xml中引用其它xml片段,然后运行在tomcat7.0.62上出现的问题具体做法如下: 1,按模块将servelet从web.xml中拷贝出来,放到一个test.xml中,如test.xml中内容如下: <servlet> <servlet-name>testA</servlet-name>
【宜信技术沙龙】是由宜信技术学院主办的系列技术分享活动,活动包括线上和线下两种形式,每期技术沙龙都将邀请宜信及其他互联网公司的技术专家分享来自一线的实践经验,分享内容覆盖金融科技及软件研发等主要技术领域,旨在为金融科技行业提供可落地实践的解决方案,为金融科技从业者带来思路想法上的启发。【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报...