外观模式(Facade)
Facade?
如果是按照RUP+ 的开发模式,随着迭代与增量的进行,软件代码会越来越庞大,各个模块之间的关系会越来越复杂,如何你是初次接受该项目的开发非非常棘手,要理解清楚他们之间的关系,才能继续完成下面的工作。不过与其这么做,不如为这个大型程序准备一个“窗口”。这样,我们就不必单独地关注每个类了,只需简单地对“窗口”提出请求即可。
-
关键字:** 责任关系,依赖关系 ,调用顺序 **
-
要点概念:提供的窗口可以理解为开辟一个高层的接口
-
声明时候使用外观设计模式:
当某个程序员得意地说出“啊,在调用那个类之前需要先调用这个类。在调用那个方法之前需要先在这个类中注册一下”的时候,就意味着我们需要引入Facade角色了。 -
相关设计模式:
◆Abstract Factory模式(第8章)可以将Abstract Factory 模式看作生成复杂实例时的Facade模式。因为它提供了“要想生成这个实例只需要调用这个方法就OK了”的简单接口。
◆Singleton模式(第5章)有时会使用Singleton模式创建Facade角色。
◆Mediator模式(第16章)在Facade模式中,Facade角色单方面地使用其他角色来提供高层接口(API)。
而在Mediator模式中,Mediator角色作为Colleague角色间的仲裁者负责调停。可以说,Facade模式是单向的,而Mediator角色是双向的。
理解职责
- 目的:实现读取text文本转为一个网页链接的程序
包==>类>解释
pagemaker |Database 从邮件地址中获取用户名的类
pagemaker |HtmlWriter 编写HTML文件的类
pagemaker |PageMaker |根据邮件地址编写该用户的Web页面
|无需package|MainT测试程序行为的类
HtmlWriter :html中隐藏声明要求必须先调用title()而在PageMaker中我们提前就维护好了调用的顺序,后面在MainT不需要关系具体的调用依赖关系。
UML
类图:
Code
- DataBase :
public class DataBase {
private DataBase(){
}
/**
* 输入文件名读取数据
* @param filname
* @return
*/
public static Properties getProperties(String filname){
String filename=filname+".ini";
Properties prop = new Properties();
try {
prop.load(new FileInputStream(filename));
}catch (IOException e){
e.printStackTrace();
}
return prop;
}
}
- HtmlWriter :
public class HtmlWriter {
private Writer printWriter;
public HtmlWriter(Writer writer) {
this.printWriter = writer;
}
// 输出标题 (这是隐藏条件必须先调用title方法)
public void title(String title) throws IOException {
printWriter.write("<html>");
printWriter.write("<head>");
printWriter.write("<title>"+title+"</title>");
printWriter.write("</head>");
printWriter.write("<body>\n");
printWriter.write("<h1>"+title+"</h1>");
}
// 输出段落
public void paragraph(String msg)throws IOException{
printWriter.write("<p>"+msg+"</p>");
}
// 输出超链接
public void link(String href,String caption) throws IOException{
printWriter.write("<a href=\""+href+"\">"+caption+"</a>");
}
// 输出邮件地址
public void mailto(String mailaddr,String username) throws IOException{
link("mailto:"+mailaddr,username);
}
public void close() throws IOException{
printWriter.write("</body>");
printWriter.write("</html>\n");
printWriter.close();
}
}
- PageMaker:
public class PageMaker {
private PageMaker(){
}
/**
* 外观接口
* @param mailaddr
* @param filename
*/
public static void makeWelcomePage(String mailaddr,String filename){
try {
Properties mailporo = DataBase.getProperties("testmail");
String usernmae = mailporo.getProperty(mailaddr);
HtmlWriter htmlWriter = new HtmlWriter(new FileWriter(filename));
htmlWriter.title("欢迎来到"+usernmae+"页面!");
htmlWriter.paragraph(usernmae+"欢迎来到"+usernmae+" 的主页。");
htmlWriter.paragraph("欢迎给我发送邮件:");
htmlWriter.link(mailaddr,usernmae);
htmlWriter.close();
System.out.println("这是由于"+usernmae+"创建的邮件的主页界面"+ "From to"+usernmae);
}catch (IOException e){
e.printStackTrace();
}
}
}
- MainT:
public class MainT {
public static void main(String[] args) {
PageMaker.makeWelcomePage("123@qq.com","welcome.html");
}
}