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());
}
}
大功告成了,客户非常满意,哈哈。
(待续)
最近耐着性子看一些老皇历的设计模式学习资料,感觉比较痛苦。大多数设计模式并非艰涩难懂,理解上的障碍往往只是中国人美国人表达方式不同。可是当这种差异被某些达人放大了百倍以后,大众化的东西变得神秘兮兮。这个东西不必死扣字眼,咬文嚼字,本来就是翻译过来的东西。抽象的看概念不如老老实实敲几行代码,按着自己的理解做几个玩具程序。
有人说学点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());
}
}
大功告成了,客户非常满意,哈哈。
(待续)
相关文章推荐
- java 设计模式学习笔记七 facade外观模式
- Java-设计模式-三种工厂模式-比较区分
- Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- 设计模式学习笔记---外观模式Facade pattern(Java版)
- java学习之三种常用设计模式
- java学习之三种常用设计模式
- java 设计模式学习笔记七 facade外观模式
- 黑马程序员—java基础学习--单例设计模式
- java设计模式之九外观模式(Facade)
- java中的23中设计模式学习
- java设计模式学习1--Singleton Pattern[原创]
- 设计模式学习笔记---代理模式Proxy(Java版)
- 设计模式学习笔记(十一)——Facade外观模式
- Java设计模式学习---代理模式
- 设计模式学习笔记---桥接模式bridge(Java版)
- java设计模式之外观模式(Facade)
- PureMVC学习系列-从源码深度剖析PureMVC(从PureMVC中看设计模式-Facade门面模式)
- Java设计模式学习记录-责任链模式
- java 设计模式学习笔记十六 chain of responsibility 职责链设计模式