设计模式学习之外观模式

外观(Facade)模式,同属于结构型设计模式,是一个看似简单,要说清楚却又不容易的模式。之所以这么说,是因为这个模式并没有一个定式。我试图很好的理解外观模式,看过不少网友的介绍,无非都是“外观模式定义一个更高层的接口,使子系统更容易使用”、“解耦”之类的,这确实是外观模式的作用。但我觉得理解起来还是很吃力。下面是我对外观模式的理解,就从网上常用的封装数据库jdbc开始:

public class DBCompare {
    Connection conn = null;
    PreparedStatement prep = null;
    ResultSet rset = null;
    try {
        Class.forName( "<driver>" ).newInstance();
        conn = DriverManager.getConnection( "<database>" );
        String sql = "SELECT * FROM <table> WHERE <column name> = ?";
        prep = conn.prepareStatement( sql );
        prep.setString( 1, "<column value>" );
        rset = prep.executeQuery();
        if( rset.next() ) {
            System.out.println( rset.getString( "<column name" ) );
        }
    } catch( SException e ) {
        e.printStackTrace();
    } finally {
        rset.close();
        prep.close();
        conn.close();
    }
}

上面是使用jdbc对数据库进行操作的最原始的办法。如果是使用多种数据库或者需要扩展新数据库的场景,这样的设计有一定的缺陷,不好扩展,针对不同的数据库,代码重复度很高…反正就是各种不爽。那么可以使用外观模式,将看上去复杂的jdbc调用隐藏起来,对外暴漏一个简洁的、统一的抽象层:

class Database{
    public Oracle getOracleObject(String username,String password,String url){}
    public SqlServer getSqlServerObject(String username,String password,String url){}
    public MySql getMySqlObject(String username,String password,String url){}
}

上面说明的是外观模式用于定义一个更高层次的接口层。

外观模式也可以用于隐藏部分功能。在<<how tomcat works>>这本书中就几次提到外观模式,例如介绍process()方法:

1、process方法接收的参数类型为 HttpRequest 和 HttpResponse。方法签名如下:
public void process(HttpRequest request, HttpResponse response);
2、process 使用了 request 和 response 的外观类,并在调用了 servlet 的 service 方法后,再调用HttpResponse 的 finishResponse 方法。示例代码如下:
servlet = (Servlet) myClass.newInstance();
HttpRequestFacade requestPacade = new HttpRequestFacade(request);
HttpResponseFacade responseFacade = new
HttpResponseFacade(response);
servlet.service(requestFacade, responseFacade);
((HttpResponse) response).finishResponse();

这里之所以使用外观类,是因为,在HttpRequest和HttpResponse类中有部分属性或者方法,不希望在service()方法中被访问到,其实HttpRequestFacade和HttpResponseFacade分别是HttpRequest和HttpResponse的一个简化类。虽然这里外观类和原始类实现同样的接口,外观类只是原始类的简化,但是外观类不能继承原始类,否则service()方法中能通过上转,转换成原始类而访问被隐藏的部分。

“隐藏”是我对外观模式的应用场景的一种理解,不管是隐藏子系统的复杂性还是防止某种情况被访问到,欢迎拍砖~

时间: 2024-08-01 03:32:22

设计模式学习之外观模式的相关文章

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信

设计模式学习笔记--外观模式

好久没写设计模式的blog了,这次重新回来填坑,先找一个最简单但是却最常用的设计模式来学习,外观模式.其实说是一个设计模式,其实我们在实际的编程中无时无刻不在用外观模式,可以说这个设计模式已经渗透到编程的各个方便,可能我们自己没感觉出来罢了. 一.外观模式的定义 先来看一下外观模式的定义: 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一系列子系统更加容易使用. 简单解释一下,所谓外观模式,就是在我们设计系统的时候,将若干个子系统的功

设计模式学习心得&lt;外观模式 Facade&gt;

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 概述 意图 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决 降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用 客户端不需要知道系统

设计模式学习笔记——外观模式

1.特点:子系统的高层接口,避免两个类直接关系的第三者. 2.概念:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 3.类图: 4.程序实现: /// <summary> /// 子系统中的一个类 /// </summary> public class SubSystemOne { public void MethodeOne() { Console.WriteLine("Sub System first metho

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

设计模式学习之代理模式(Proxy)

一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正的实现是在这里 代理类:同样实现了业务接口,一般都会关联一个实现类的实例,由它来调用实现类 客户端:顾名思义,使用者,与代理类打交道,甚至都不知道具体实现类的存在. 二.代理模式设计图 三.代理模式的简单实现代码 BizInterface.java package com.lipan.designp

设计模式学习--------12.代理模式学习

场景: 福尔摩斯一直想送礼物给花生,但是羞于直接赠送,于是想到让房东太太去帮忙送礼物.编程如何实现呢? 定义: 为其他对象提供一种代理以控制对这个对象的访问. 角色: Proxy:代理对象.有下列功能: 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. 持有一个具体目标对象的引用,可以在需要时调用具体的目标对象. 可以控制对目标对象的访问,并可以负责创建和删除它. package com.kris.study; public class Proxy implements