1 引子
在上一篇中,工厂模式终于跌进了核武器时代……
古人常说大隐隐于市,大概很多的模式最终都会走上这条幕后之路,在层层框架的封装包裹之下,他们的本来面目渐渐淡出程序猿们的视野,甚至被遗忘;而事实上,他们却在程序猿们的眼皮子底下呐喊。
恩恩,今天是迟来的第二篇,咱们来谈谈门面模式。
2 父亲的手艺
年轻时的父亲是顶着光环的存在,十里八乡,造砖造瓦、烧窑盖房的,总少不得有人来请父亲主持大事。
父亲总是能让乡亲们把土胚老屋换成红砖新房,这从无到有的过程,从寻土到制砖制瓦,再到煤饼的制作,到砖窑瓦窑的建设,再到烧制;从房子地基的设计挖掘,到砌墙,到门窗安装,再到楼层铺设,到收栋封顶,再到固顶铺瓦。事无巨细,清清楚楚,行云流水,让人叹服。
年幼的我无法想象一个人的大脑是如何装得下这许多,当我发现周围的成年人们也和我一样,是以45度角仰望父亲时,我大概能明白这恐怕不是一件普通人能够做得好的事情。多年以后,当我踩出程序猿人的脚印时,我仍然记得人们45度角的目光,于是我尝试做一件与父亲当年类似的事情。
我写了一段代码,当某用户登录成功后,给其他所有在线用户广播一条消息:
...
// 生成消息文本
String msgText = userName + "logined at (new Date()).toLocaleString()";
// 连接到ActiveMQ服务器
ActiveMQConnectionFactory factory =new ActiveMQConnectionFactory("tcp://localhost:61616");
// 创建ActiveMQ连接
Connection connection =factory.createConnection();
connection.start();
// 创建会话
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建主题
Topic topic =session.createTopic("Online.Users");
// 创建消息发布者
MessageProducer producer =session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 创建消息体
TextMessage message =session.createTextMessage();
message.setText(msgText);
// 发送消息
producer.send(message);
…
当代码运行后,真的可以每个用户收到消息通知时,我激动莫名,直以为循着父亲的足迹可以迈向先贤之路。却不知道,这仅仅是一个开始。
3 自己的房子
父亲渐渐年迈,不觉然间我亦近而立。多少年了,父亲没有再被请去主持造砖盖房的事业,却迎来了我的第一幢房子的动工。
父亲没有再寻土,不再造砖模瓦模,也不再做煤饼,更不再造砖窑瓦窑了;找到砖瓦厂的电话,联系了司机,工地上便陆续堆起了砖瓦。父亲请来了工匠,房子地基很快打好,门窗也做好,于是乎铺楼盖瓦,砌地刷墙,父亲不再事事躬亲,似乎成了一个看客。然而,房子依然很快便造好了;工期比父亲以前主持的时间短很多很多,而父亲即使年迈,也觉得轻松无比。
看来,造房子其实不需要那么复杂,更不用那么辛苦。
我回顾了自己的程序猿之路,发现先贤与我不同,他们所为近乎于道,而我只是蹒跚学步的小猿人而已。我彻夜未眠,或许我可以把代码改的好看一点:
…
class Publisher{
private Connection connection = null;
private MessageProducer producer = null;
public Publisher(String url, topicName) {
// 连接到ActiveMQ服务器
ActiveMQConnectionFactory factory= new ActiveMQConnectionFactory(url);
// 创建ActiveMQ连接
connection =factory.createConnection();
connection.start();
// 创建会话
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建主题
Topic topic =session.createTopic(topicName);
// 创建消息发布者
producer =session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
public void send(String text) {
// 创建消息体
TextMessage message =session.createTextMessage();
message.setText(text);
// 发送消息
producer.send(message);
}
}
…
String msgText = userName + "logined at (new Date()).toLocaleString()";
Publisher publisher = new Publisher("tcp://localhost:61616","Online.Users");
publisher.send(msgText);
…
恩,似乎从父亲的身上,我又领悟到了些什么。
貌似这样做之后,我不用再费力维护代码的初始化顺序,也不用理会之间的细节关系和流程。而且代码看上去更容易理解了,更是隐约间觉得,如果我要给隐身的用户发送消息的话,代码也跟着变得简单易懂了。
4 女儿的积木
时光匆匆,屌丝仍然是屌丝,但不同的是,屌丝也有了家室,有了一岁的女儿。某天夫人问我,该给女儿买什么样的玩具?我几乎没有思考的说积木。很快积木回来了,我一边拆着包装一边自语:嗨,我还从来没玩过积木呢。夫人笑着说:敢情这积木是买给你,满足你童年愿望的啊?
女儿从我手上抢积木,我没让,专注的磊着桥梁,高塔,城堡,高达……,女儿一次次推倒我的作品,我一次次的重建。
我在想,我的程序猿生涯的那些代码,何时做得跟积木一样?
我又回顾了那一段代码,或许我可以做得更好:
@Autoware
Publisher publisher;
…
String msgText = userName + "logined at (new Date()).toLocaleString()";
publisher.send("Online.Users",msgText);
噢噢,这不算。
或许这样才算是更好:
String msgText = userName + "logined at (new Date()).toLocaleString()";
http.put("http://mq.gaiay.cn/onlineUsers/messages",msgText);
恩恩,好像又冒出了另一个东西:http?
是的,代码的封装是无止境的,君不见各种SDK、API、jar;各种SOA、Web Service接口、REST接口层出不穷,漫漫程序猿人路啊……
5 上帝的宫殿
最近有科技报道说,世界上最先进的神经网络已经达到4岁儿童的智力水平了,人类追求进步的脚步从未停止,即使施瓦辛格从未来穿越回来要行灭绝人类之事。
门面模式的发展很快会淹没在云端,未来的程序猿,做的更多的事情会是粘合剂的工作,用一条业务逻辑,穿插于各个云层之间。上帝的宫殿,是由云堆砌而成……