设计模式第9篇:外观设计模式

一.外观设计模式所解决的问题

外观设计模式为子系统中的一组接口提供统一的接口,这种统一的接口屏蔽了直接调用子系统时的逻辑关系,使得调用子系统时更容易。

二.外观设计模式用例

假如一个应用中有两个接口MysqlHelper.class和OracleHelper.class,两个接口功能分别是连接mysql和oracle数据库,然后生成HTML报表或者PDF报表,代码说明如下:

MysqlHelper.class和OracleHelper.class

import java.sql.Connection;

class MySqlHelper {

    public static Connection getMySqlDBConnection(){
        //get MySql DB connection using connection parameters
        return null;
    }

    public void generateMySqlPDFReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

    public void generateMySqlHTMLReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }
}
class OracleHelper {

    public static Connection getOracleDBConnection(){
        //get Oracle DB connection using connection parameters
        return null;
    }

    public void generateOraclePDFReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

    public void generateOracleHTMLReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

}

外观类HelperFacade.class

import java.sql.Connectionclass HelperFacade{
    public static void generateReport(DatabaseType dbType,ReportType reportType,String tableName){
        Connection con=null;
        switch (dbType){
            case MYSQL:
                con=MySqlHelper.getMySqlDBConnection();
                MySqlHelper mySqlHelper=new MySqlHelper();
                switch (reportType){
                case HTML:
                    mySqlHelper.generateMySqlHTMLReport(tableName,con);
                    break;
                case PDF:
                    mySqlHelper.generateMySqlPDFReport(tableName,con);
                    break;
                }
                break;
            case ORACLE:
                con=MySqlHelper.getMySqlDBConnection();
                OracleHelper oracleHelper=new OracleHelper();
                switch (reportType){
                    case HTML:
                        oracleHelper.generateOracleHTMLReport(tableName,con);
                        break;
                    case PDF:
                        oracleHelper.generateOraclePDFReport(tableName,con);
                        break;
                }
        }
    }
    public static enum DatabaseType{
      MYSQL,ORACLE
    }
    public static enum ReportType{
        HTML,PDF
    }
}

直接调用子接口和调用统一接口(外观类)对比:

import java.sql.Connection;

import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;

public class FacadePatternTest {

    public static void main(String[] args) {
        String tableName="Employee";

        //generating MySql HTML report and Oracle PDF report without using Facade
        Connection con = MySqlHelper.getMySqlDBConnection();
        MySqlHelper mySqlHelper = new MySqlHelper();
        mySqlHelper.generateMySqlHTMLReport(tableName, con);

        Connection con1 = OracleHelper.getOracleDBConnection();
        OracleHelper oracleHelper = new OracleHelper();
        oracleHelper.generateOraclePDFReport(tableName, con1);

        //generating MySql HTML report and Oracle PDF report using Facade
        HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
        HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
    }

}

三.外观设计模式使用场景

1.外观设计模式可以运用在任何开发阶段,通常用在接口数量越来越多、系统变得复杂的时候。

2.子接口不应该有外观类的引用。

3.子接口提供的功能应该相似,因为外观接口就是通过包装子接口来提供一个接口来做一些相似的功能。

原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10247304.html

时间: 2024-10-02 14:05:00

设计模式第9篇:外观设计模式的相关文章

设计模式之总结篇(设计模式六大原则以及设计模式三种类型)

经过这半年的学习,自己对设计模式这门课程也有了一定的认知.前面也发了关于23个设计模式的博客.现在对这些设计模式进行一个整体的总结. 首先,设计模式有六大原则: 原则一.单一职责原则 定义:There should never be more than one reason for a class to change(不要存在多于一个导致类变更的原因).通俗的说,即一个类只负责一项职责. 好处: 1.降低类的复杂度. 2.提高可读性. 3.提高可维护性. 4.变更引起的风险降低. 原则二.里氏替

IOS设计模式第三篇之外观设计模式

外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性.这种模式是理想的在处理大量的类,特别是当他们复杂的使用或者很难理解的时候. 这个外观设计模式使用系统的接口和你隐藏的实现来分离代码.他也减少了依赖外部代码的子系统运作.这也是有用的如果在外观设计模式的类可能会改变,外部类可以保留相同的API同时改变幕后的事情. 例如有一天你可能想替换你的服务器端,

php设计模式笔记--总结篇

一.引入  设计模式的一般定义不再说,只大概说一下我理解的设计模式,我理解的设计模式的主要目的是利用面向对象(类.接口等)特点,让代码更加易于扩展,易于重用,易于维护.这三个特点也就要求我们不要将太多功能积攒到一个类里面,而是分配到更多的类里面.所以,二十种乃至更多的设计模式主要是围绕上述四个目的进行设计的. php设计模式这一本书讲了19种设计模式,但其实有大部分设计模式思想上或者设计上是一样的思维与形式,我将在下面进行归类和总结,以便于大家更好地理解这本书,但大家最好看一下这本书,里面的使用

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

php设计模式之Proxy(代理模式)和Facade(外观)设计模式

Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息还可以利用Proxy的类确定代码的范围或调试程序中存在的问题 <?php class LoggingProxy{ private $target; //传递进去一个对象 public f

下面给出了四种设计模式的作用: 外观(F

下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能: 单件(Singleton :保证一个类仅有一个实例,并提供一个访问它的全局访问点: 模板方法(Template Method :在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现. 请根据下面叙述的场景选用适当的设计模式.若某面向对象系统中的某些类有

外观设计模式

外观设计模式 外观设计模式向复杂的子系统提供了简单的接口,相比将一系列的类和他们的接口暴露给用户,你只需要暴露一些简单的未定义的API. 接下来的图片解释了这一概念. 使用这些API接口的人完全没有意识到你这下面隐藏的复杂性,在有一系列类,特别是他们使用很复杂或者难以理解的时候,这个模式是非常好的. 外观设计模式使用从接口层面去使用,在实现技术上隐藏而将代码解藕了.它也减少了你外部的代码对于内部子系统代码的依赖性.它在外观模式可能要进行 改变的情况下也是很有用的,因为外观的类仍然可以保持相同的A

Head First 设计模式之适配器模式与外观模式

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.