一天学习两个设计模式之Facade模式(外观模式,结构型模式)
2017-05-03 19:36
891 查看
程序这东西随着时间推移,程序会越来越大,程序中的类越来越多,而且他们之间相互关联,这会导致程序结构变得越来越复杂。因此我们在使用他们时候,必须要弄清楚他们之间的关系才能使用他们。
特别是在调用大型程序进行处理时候,我们需要弄清楚错综复杂的关系。不过与其这么做不如为这个大程序准备一个"窗口"。这样,我们就不必为关注每一个类了,只需要对窗口提出请求即可!
这个窗口就是我们要学习的Facade模式,(也叫:外观模式)。Facade是一个源自于法语的单词,它的意思是:“建筑物的表面”
使用Facade模式可以为相互关联在一起错综复杂的对象整理出高层接口(API)。其中的Facade角色可以让系统对外提供一个简单的接口(API)。而且Facade角色还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正确顺序调用各个类。
源码结构以及职责:
DataBase
从邮件地址中获取用户名的类
HtmlWriter
编写Html文件的类
PageMaker
根据邮件地址编写该用户的Web页面
Main
测试程序的类
示例程序的类图:
源码:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class Database {
private Database() { // 防止外部new出Database的实例,所以声明为private方法
}
public static Properties getProperties(String dbname) { // 根据数据库名获取Properties
String filename = "C:\\Coding\\设计模式\\src\\Facade\\Sample\\pagemaker\\" + dbname + ".txt";
Properties prop = new Properties();
try {
prop.load(new FileInputStream(filename));
} catch (IOException e) {
System.out.println("Warning: " + filename + " is not found.");
}
return prop;
}
}
测试程序:
import Facade.Sample.pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome设计模式.html");
}
}
总结:
Facade外观模式存在的角色以及在本例子中对应关系:
Facade窗口:
Facade角色是代表其他许多角色的“简单窗口”。Facade角色想系统外部提供高层接口API。在示例中有PageMaker类扮演此角色。
构成系统的许多其他角色:
这些角色各自完成各自的工作,他们并不知道Facade角色的存在,Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色。在本例子中有
HtmlWriter和Database类扮演此角色。
Client(请求者):
Client角色负责调用Facade角色,Client并是不Facade的一部分,在本示例中由Main类扮演此角色
Facade模式的类图:
总结:这个设计模式我们一般会经常用到,可能在使用过程中我们没有把它当做一种设计模式来理解而已!
源码代码地址:http://git.oschina.net/leodaxin/javapattern ,类图的源文件都在代码仓库中,本人使用的是starUml工具。
特别是在调用大型程序进行处理时候,我们需要弄清楚错综复杂的关系。不过与其这么做不如为这个大程序准备一个"窗口"。这样,我们就不必为关注每一个类了,只需要对窗口提出请求即可!
这个窗口就是我们要学习的Facade模式,(也叫:外观模式)。Facade是一个源自于法语的单词,它的意思是:“建筑物的表面”
使用Facade模式可以为相互关联在一起错综复杂的对象整理出高层接口(API)。其中的Facade角色可以让系统对外提供一个简单的接口(API)。而且Facade角色还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正确顺序调用各个类。
源码结构以及职责:
DataBase
从邮件地址中获取用户名的类
HtmlWriter
编写Html文件的类
PageMaker
根据邮件地址编写该用户的Web页面
Main
测试程序的类
示例程序的类图:
源码:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class Database {
private Database() { // 防止外部new出Database的实例,所以声明为private方法
}
public static Properties getProperties(String dbname) { // 根据数据库名获取Properties
String filename = "C:\\Coding\\设计模式\\src\\Facade\\Sample\\pagemaker\\" + dbname + ".txt";
Properties prop = new Properties();
try {
prop.load(new FileInputStream(filename));
} catch (IOException e) {
System.out.println("Warning: " + filename + " is not found.");
}
return prop;
}
}
import java.io.Writer; import java.io.IOException; public class HtmlWriter { private Writer writer; public HtmlWriter(Writer writer) { // 构造函数 this.writer = writer; } public void title(String title) throws IOException { // 输出标题 writer.write("<html>"); writer.write("<head>"); writer.write("<title>" + title + "</title>"); writer.write("</head>"); writer.write("<body>\n"); writer.write("<h1>" + title + "</h1>\n"); } public void paragraph(String msg) throws IOException { // 输出段落 writer.write("<p>" + msg + "</p>\n"); } public void link(String href, String caption) throws IOException { // 输出超链接 paragraph("<a href=\"" + href + "\">" + caption + "</a>"); } public void mailto(String mailaddr, String username) throws IOException { // 输出邮件地址 link("mailto:" + mailaddr, username); } public void close() throws IOException { // 结束输出HTML writer.write("</body>"); writer.write("</html>\n"); writer.close(); } }
import java.io.FileWriter; import java.io.IOException; import java.util.Properties; public class PageMaker { private PageMaker() { // 防止外部new出PageMaker的实例,所以声明为private方法 } public static void makeWelcomePage(String mailaddr, String filename) { try { Properties mailprop = Database.getProperties("maildata"); String username = mailprop.getProperty(mailaddr); HtmlWriter writer = new HtmlWriter(new FileWriter(filename)); writer.title("Welcome to " + username + "'s page!"); writer.paragraph("欢迎来到" + username + "的主页。"); writer.paragraph("等着你的邮件哦!"); writer.mailto(mailaddr, username); writer.close(); System.out.println(filename + " is created for " + mailaddr + " (" + username + ")"); } catch (IOException e) { e.printStackTrace(); } } }数据:
hyuki@hyuki.com=Hiroshi Yuki hanako@hyuki.com=Hanako Sato tomura@hyuki.com=Tomura mamoru@hyuki.com=Mamoru Takahashi
测试程序:
import Facade.Sample.pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome设计模式.html");
}
}
总结:
Facade外观模式存在的角色以及在本例子中对应关系:
Facade窗口:
Facade角色是代表其他许多角色的“简单窗口”。Facade角色想系统外部提供高层接口API。在示例中有PageMaker类扮演此角色。
构成系统的许多其他角色:
这些角色各自完成各自的工作,他们并不知道Facade角色的存在,Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色。在本例子中有
HtmlWriter和Database类扮演此角色。
Client(请求者):
Client角色负责调用Facade角色,Client并是不Facade的一部分,在本示例中由Main类扮演此角色
Facade模式的类图:
总结:这个设计模式我们一般会经常用到,可能在使用过程中我们没有把它当做一种设计模式来理解而已!
源码代码地址:http://git.oschina.net/leodaxin/javapattern ,类图的源文件都在代码仓库中,本人使用的是starUml工具。
相关文章推荐
- 一天学习两个设计模式之Facade模式(外观模式,结构型模式)
- 设计模式学习之路——Facade 外观模式(结构型模式)
- 【设计模式学习笔记十一】【结构型模式】【外观模式(Facade)】
- 设计模式学习之外观模式(Facade,结构型模式)(8)
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- [导入]C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式).zip(7.52 MB)
- 设计模式十一:facade(外观)——对象结构型模式
- 设计模式学习-Facade(外观)
- 设计模式学习笔记(十一)——Facade外观模式
- 设计模式学习笔记(十一)——Facade外观
- java 设计模式学习笔记七 facade外观模式
- 设计模式学习笔记(一)--Facade外观模式
- 设计模式学习笔记(十一)——Facade外观模式
- Facade外观模式 ---设计模式学习
- 设计模式学习-Facade(外观)
- 设计模式学习总结-外观模式(Facade Pattern)
- 十三.结构型设计模式——Facade Pattern(外观模式)
- 设计模式学习笔记(十一)——Facade外观模式
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- 设计模式学习笔记(十一)——Facade外观模式