您的位置:首页 > 编程语言 > Java开发

Java设计模式学习A------比较Facade Proxy Adapter三种设计模式

2008-06-17 14:53 567 查看
Java设计模式学习笔记1------比较Facade Proxy Adapter三种设计模式
最近耐着性子看一些老皇历的设计模式学习资料,感觉比较痛苦。大多数设计模式并非艰涩难懂,理解上的障碍往往只是中国人美国人表达方式不同。可是当这种差异被某些达人放大了百倍以后,大众化的东西变得神秘兮兮。这个东西不必死扣字眼,咬文嚼字,本来就是翻译过来的东西。抽象的看概念不如老老实实敲几行代码,按着自己的理解做几个玩具程序。
有人说学点spring可以提高设计模式的理解,事实上反过来更有道理。一个完全没有设计模式概念的人去看spring可以学得不错,可是忘得也快。如果能带着一点设计模式概念去学习spring也许更有味道,更容易相互促进的说。
好了闲话少说,进入正题。
Façade设计模式是个很主流的东西,我们日常编码中用得很多。没学习过设计模式的往往早就用熟了Façade模式,只不过没这个概念罢了。Façade模式可以这么理解:有好多类的好多方法,我们总需要按某个固定的搭配来反复调用。所以不妨做个方法,把这个固定搭配统统塞进去。这样我们每次只需调用一个方法就搞定了。
假设我们的客户有个简单的需求,要求我们能获取一条String类型的message来表示当前时间和当前时区,像这样:
06/17/2008 13:34:40
中国标准时间
(如果每个客户的需求都是如此简单明了,程序员要偷着乐了。)
而幸运的是我们这边已经有2个类分别可以获取当前时间和当前时区。
TimeService类的getTimeString()方法可以获得当前时间:
package com.fansy.facade;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TimeService {
public String getTimeString() {
Calendar ca = Calendar.getInstance();
String format = "MM/dd/yyyy HH:mm:ss";
SimpleDateFormat formatter = new SimpleDateFormat(format);
return formatter.format(ca.getTime());
}
}

PlaceService类的getPlaceString()方法可以获得当前时区:
package com.fansy.facade;
import java.util.Calendar;

public class PlaceService {
public String getPlaceString() {
Calendar ca = Calendar.getInstance();
return ca.getTimeZone().getDisplayName();
}
}
为了客户简单的需求,我们用Façade设计模式将这2个方法组合起来:
首先我们声明一个供客户调用的接口AbstractMessageProducer:
package com.fansy.facade;
public interface AbstractMessageProducer {
public String getMessage();
}

做个这个接口的实现类SimpleMessgerProducer:
package com.fansy.facade;
public class SimpleMessgerProducer implements AbstractMessageProducer{
public String getMessage() {
StringBuffer buff = new StringBuffer();
TimeService ts = new TimeService();
PlaceService ps = new PlaceService();
buff.append(ts.getTimeString());
buff.append("/n");
buff.append(ps.getPlaceString());
return buff.toString();
}
}
可以看到,SimpleMessgerProducer类的getMessage方法调用了TimeService类和PlaceService类的方法。这样客户只需一个getMessage方法就能获得想要的东西,而不是自己到TimeService,PlaceService类Do it yourself。

我们可以写个main函数打印出来看看:
package com.fansy.facade;
public class Test {
public static void main(String args[]) {
AbstractMessageProducer p = new SimpleMessgerProducer();
System.out.println(p.getMessage());
}
}
大功告成了,客户非常满意,哈哈。
(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: