一、题目
例如在FX项目中,经常需要近乎实时地为客户提供外汇新闻。通常情况下,都是先从不同的新闻社订阅新闻来源,然后通过批处理程序定时地到指定的新闻服务器抓取最新的外汇新闻,接着将这些新闻存入本地数据库,最后在FX系统的前台界面显示。(引自Spring揭秘)
二、影响范围
2.1 由用户去取对象转变成用时别人送来,省力提效。
2.2 结合多态更利于业务功能扩展(例如仅传入一个接口,通过多种类型业务实现该接口完成扩展)。
2.3 核心影响:解耦具有依赖关系的各业务对象间的强绑定方式。
二、思路
1)订阅新闻动作:可以去监听不同新闻社给新闻的消息通知接口,监听到后放到服务器的数据库中。
2)抓取新闻:去服务的数据库中搜索出一天的外汇新闻信息,然后同步到本地数据库里。
3)前台界面显示:做前端页面,拉取数据库数据,分行展示新闻信息。
三、解决
一共涉及到三种方法实现,分别是获取新闻信息(FXNewsListener)、保存新闻信息(FXNewsPersistent)和向外提供新闻信息(FXNewsProvider)。然后通过main方法直接调用下方程序即可完成新闻提供能力。
FXNewsProvider fxNewsProvider = new FXNewsProvider();
fxNewsProvider.providNews();
FXNewsListener:获取新闻信息,如下:
public class FXNewsListener {
private Map<Integer, String> FXNewsContent;
/**
* 提供新闻信息内容
*/
public Map getFXNewsContent(){
//模拟拉取新闻信息逻辑
Map<Integer, String> fxNewsContent = new HashMap<Integer, String>();
fxNewsContent.put(1,"今天天气很好");
this.FXNewsContent = fxNewsContent;
return FXNewsContent;
}
}
FXNewsPersistent:存储新闻信息到本地内存中,提供存储方法和获取信息方法。
package com.demo.spring.chapter02.fxNews;
import java.util.Map;
public class FXNewsPersistent {
private Map<Integer, String> newsContent;
public void persistentNewsContent(Map newsContent){
if(null == this.newsContent){
this.newsContent = newsContent;
}else {
this.newsContent.putAll(newsContent);
}
System.out.println("完成存储:" + newsContent.toString());
}
public Map getPersistentNewsContent(){
return this.newsContent;
}
}
FXNewsProvider:新闻提供,先获取新闻信息,然后存储新闻信息,最后展示出存储结果。
package com.demo.spring.chapter02.fxNews;
import java.util.Map;
public class FXNewsProvider {
private FXNewsListener fxNewsListener = new FXNewsListener();
private FXNewsPersistent fxNewsPersistent = new FXNewsPersistent();
public void providNews(){
Map fxNewsContent = fxNewsListener.getFXNewsContent();
if(null != fxNewsContent){
fxNewsPersistent.persistentNewsContent(fxNewsContent);
}
System.out.println("展示存储后的结果" + fxNewsPersistent.getPersistentNewsContent());
}
}
四、结果
完成存储:{1=今天天气很好}
展示存储后的结果{1=今天天气很好}
五、对比&优化
现有:提供新闻方法里面使用了获取新闻和监听新闻方法,现有处理方式是对这些方法进行new实例化后,使用其实例后的方法。
可优化:如果获取新闻被很多其他的新闻处理类方法使用时,岂不是要每个地方都去new一次,有没有更好的办法呢?有,Spring提供的控制反转(IOC)即是提供一个全局的IoCServiceProvider类把后续要使用的类进行一次new实例化。当要用到这些类(例如获取新闻类)时,仅需使用
private FXNewsListener fxNewsListener ;
替代
private FXNewsListener fxNewsListener = new FXNewsListener();
即可。省去每次新实例化一个对象的过程。而且在IoCServiceProvider中可以设置仅实例化一次,提高空间利用率。
结构:题目、影响范围、思路、解决、结果、对比&优化、参考