设计模式:外观(Facade)模式

设计模式:外观(Facade)模式

一、前言

  外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一个新的类,然后在这个类里面将类A和B的处理步骤整合在一起,对于外界我们只暴露新的类中的这个接口,这样代码的复用性就非常的好了,可以将这些代码作为组件去让其他程序去使用,这在我们的开发之中是非常常见的。甚至我们可以将抽象工厂模式中创建产品的接口当做外观模式的一种应用,这也是一种整合。对于模板方法,其实我们也是在父类之中面向抽象编程的,将一些关系整合起来,不过差别还是非常明显的,在外观模式中没有继承关系,是新建一个类来整合其它类之间复杂的相互依赖,调用等关系,因此外观模式比较直观。

二、代码

DataBase 类:
 1 package zyr.dp.facade;
 2
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.util.Properties;
 7
 8 public class DataBase {
 9     private DataBase(){
10
11     }
12     public static Properties getProperties(String dbName){
13         Properties pro=new Properties();
14
15         try {
16             pro.load(new FileInputStream(dbName+".txt"));
17         } catch (FileNotFoundException e) {
18             e.printStackTrace();
19         } catch (IOException e) {
20             e.printStackTrace();
21         }
22         return pro;
23     }
24
25 }

 HTMLWriter类:

 1 package zyr.dp.facade;
 2
 3 import java.io.IOException;
 4 import java.io.Writer;
 5
 6 public class HTMLWriter {
 7
 8     private Writer writer;
 9     public HTMLWriter(Writer writer){
10         this.writer=writer;
11     }
12     public void title(String theTitle){
13         try {
14             writer.write("<html><head><title>"+theTitle+"</title></head><body>\n");
15             writer.write("<h1>"+theTitle+"</h1>\n");
16         } catch (IOException e) {
17             e.printStackTrace();
18         }
19     }
20     public void paragraph(String msg){
21         try {
22             writer.write("<p>"+msg+"</p>\n");
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26     }
27     public void link(String href,String caption){
28             paragraph("<a href=\""+href+"\" >"+caption+"</a>");
29     }
30     public void mailTo(String mailAddr,String username) {
31         link("mailto:"+mailAddr,username);
32     }
33     public void close() {
34         try {
35             writer.write("</body></html>\n");
36             writer.close();
37         } catch (IOException e) {
38             e.printStackTrace();
39         }
40     }
41 }

 PageMaker类:

 1 package zyr.dp.facade;
 2
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5 import java.util.Properties;
 6
 7 public class PageMaker {
 8     private PageMaker(){
 9     }
10     public static void makePage(String mailAddr,String filename) throws IOException{
11         Properties pro=DataBase.getProperties("mailData");
12         String username=pro.getProperty(mailAddr);
13         HTMLWriter html=new HTMLWriter(new FileWriter(filename));
14         html.title("编程之美");
15         html.paragraph("欢迎 "+username+" 来到我的程序空间!");
16         html.paragraph("这里有你想要的一切~~");
17         html.mailTo(mailAddr, username);
18         html.close();
19         System.out.println("为"+username+"创建"+filename+"文件成功!");
20     }
21
22 }
main类:
 1 package zyr.dp.facade;
 2
 3 import java.io.IOException;
 4
 5 public class Main {
 6
 7     public static void main(String[] args) {
 8         try {
 9             PageMaker.makePage("[email protected]", "my_html.html");
10         } catch (IOException e) {
11             e.printStackTrace();
12         }
13     }
14
15 }

 mailData存放的位置和内容:(注意如果使用相对地址,对于java程序来说src的上一级就是相对地址的起始地址,如果要放到src里面可以使用“./src/...”)。

  运行结果:

   虽然程序很简单,但是要注意的地方一点也不少,首先就是我们要将外观模式的接口对应的类(pageMaker)以及一些不用生成对象的工具类的构造函数设为私有,不让外部类去创建实例,其次,我们要注意properties读取文件的时候使用相对路径应该从哪个地方开始读写,另外当我们的程序变得复杂的时候,如果将这些类封装成一个模块,如何防止类外的对象访问我们的类呢,可以将除了facade类之外的类的属性设为默认的,这样就能很好的实现高内聚低耦合的设计思想了。这些类本来没关系,但是通过一个整合之后,产生了一定的关联,在实际开发中可能形成递归结构,那就是一个facade模式中使用了很多其他的facade模式,这样不断地实现下去,形成一个facade模式树,因此灵活使用设计模式至关重要。

三、总结

  facade外观模式是一种非常常用的模式,特别是在组织一些复杂的相互调用的逻辑的时候,为外界提供统一的接口(API),可以看到在设计模式中,最常用的应该就是模板方法和facade模式了,很多时候很多需求需要我们认真的取舍,人无远虑必有近忧,同样的,只有为以后的可复用性、可扩展性来考虑,我们的代码才是好的代码。

原文地址:https://www.cnblogs.com/zyrblog/p/9246438.html

时间: 2024-10-07 04:24:39

设计模式:外观(Facade)模式的相关文章

java 实现外观(Facade)模式

/** * 角色 * @author stone * */ public class Actor { public Actor(String name) { System.out.println("创建了角色: " + name); } public void load() { System.out.println("角色加载"); } public void unload() { System.out.println("角色退出,存档"); }

设计模式之外观(Facade)模式(笔记)

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式完美的体现了依赖倒转原则和迪米特法则的思想,所以是比较常见的设计模式之一. 外观模式结构图如下: 定义三个子系统类 public class SubSystemOne { public void methodOne(){ System.out.println("子系统方法1"); } } public class SubSystemTwo { pub

外观(Facade)模式

外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似电脑组装公司一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互.外观模式通过引入一个新的外观类(Facade)来实现该功能,外观类充当了软件系统中的"电脑组装公司",它

设计模式之五-Facade模式

Facade门面模式,也是比较常用的一种模式,其含义是为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用. 以收发信件和警察检查实例为例 说明:邮局对外只有一个窗口,接收信件内容和邮件地址.对内调用邮件处理的4个函数.将复杂逻辑封装在邮局的里面,当需要增加警察来检查信件时,只需在邮局内增加警察检查信件的方法. 注意:将复杂逻辑封装起来,对外只有一个简单的接口. 抽

设计模式 外观 Facade

外观模式的作用是简化接口.它提供一个统一的接口用来访问子系统的一群接口.通过这个高层接口使子系统更容易使用. 同时,通过外观将客户从组件的子系统中解耦. Head 1st中使用了家庭影院的例子来说明外观模式. 在家庭影院中有很多接口(类).Dvd Player,Projector,Stereo, CD Player, Screen, Lights etc... 通过外观,我们可以将播放CD,播放DVD,结束播放等功能进行封装,简化这个系统的使用. “最少知识”,Least Knowledge 设

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的

设计模式 --外观模式(Facade)

什么是外观模式? 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 简单点说:外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便. 概述: 在真实的应用系统中,一个子系统可能由很多类组成.子系统的客户为了它们的需要,需要和子系统中的一些类进行交互.客户和子系统的类进行直接的交互会导致客户端对

[设计模式] 外观模式facade

外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构.DP一书的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析.语法分析.中间代码生成.机器码生成.学过编译都知道,每一步都很复杂.对于编译器这个系统,就可以使用外观模式.可以定义

设计模式之门面模式(facade)

1.定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式.要求一个子系统的外部与其内部的通讯必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 2.通用类图 Facade门面角色:客户端可以调用这个角色的方法.此角色知晓子系统的所有功能和责任.一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去,也就是说该角色没有实际的业务逻辑,只是一个委托类. subsystem子系统角色:可以同时有一个或多个子系统.每个子系统都不

设计模式 外观模式 一键电影模式

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25837275 这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用.其实就是为了方便客户的使用,把一群操作,封装成一个方法. 举个例子:我比较喜欢看电影,于是买了投影仪.电脑.音响.设计了房间的灯光.买了爆米花机,然后我想看电影的时候,我需要