外观模式(简单窗口)
用处
隐藏复杂系统,向客户端提供一个可以访问的API
角色
- Facade(窗口)
Facade角色使代表构成系统的许多其他角色的就”简单窗口”。 - 构成系统的许多其他角色
这些角色各自完成自己的工作,他们并不知道Facade角色。Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色, - Client(请求资源)
Client角色负责调用Facade角色。
类图![在这里插入图片描述](https://img-blog.csdnimg.cn/bc9d4082411c4f47a40579dd07ffe56d.png)
这里Facade类依赖构成系统的许多角色ClassA,ClassB等,Class之间的依赖关系只是表明类之间的关系较为复杂,不是固定的依赖关系。
举例
//Client角色
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("hyuki@hyuki.com","welcome.html");
}
}
构成系统的其他角色,负责从数据库(.txt)中取数据的类
class Database{
private Database(){
//防止new出Database实例,所以声明为private
}
public static Properties getProperties(String dbname){
String filename = 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;
}
}
//构成系统的其他角色,负责生成html文件
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{
writer.write("</body>");
writer.write("</html>");
writer.close();
}
}
//Facade角色
class PageMaker{
private PageMaker(){
//防止外部new出PageMaker实例,所以声明为private方法
}
//对外部只提供了一个makeWelcomePage接口,这就是一个简单窗口
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+"欢迎来到"+username+"的主页。");
writer.paragraph("等着你的邮件哦!");
writer.mailto(mailaddr,username);
writer.close();
System.out.println(filename+" is created for "+mailaddr+" ("+username+")");
}catch(IOException e){
e.printStackTrace();
}
}
}
总结
- 不符合开闭原则,如果增加功能的话,需要增加类,并且需要修改Facade类
- 外观模式让API变少了,使复杂的东西变简单