Java设计模式Facade门面设计模式

本文深入探讨了门面模式的核心概念及其在简化复杂操作中的应用,通过实例展示了如何使用门面模式封装数据库连接过程,使得客户端代码更加简洁易懂。同时,通过对比未使用门面模式与使用门面模式的代码执行流程,清晰地说明了门面模式带来的便利性和效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.bianceng.cn/Programming/project/201111/31621_2.htm

http://blog.sina.com.cn/s/blog_5f1b067a0100ecak.html


门面模式有三个角色组成:

1)       门面角色( facade):这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。

2)       子系统角色:实现了子系统的功能。对它而言, façade 角色就和客户角色一样是未知的,它没有任何 façade角色的信息和链接。

3)       客户角色:调用 façade 角色来完成要得到的功能

 

模式作用:

将一些复杂的操作封装起来,以一个简单的接口提供给客户端.

可以定义多个子系统, 层次之间的粗细粒度需要把握好.一个子系统一个门面类


模式应用:
      Facade 一个典型应用就是进行数据库连接。一般我们在每一次对数据库进行访问,都要进行以下操作:先得到 connect实例,然后打开 connect 获得连接,得到一个 statement ,执行 sql 语句进行查询,得到查询结果集。

      我们可以将这些步骤提取出来,封装在一个类里面。这样,每次执行数据库访问只需要将必要的参数传递到这个类中就可以了。

 

代码:

public class ShopingCenter  
{  
    //到购物中心的服饰店购买  
    public void clothingStore()  
    {  
        Clothing c = new Clothing();  
        c.getClothing();  //购买到衣服  
    }  
  
    //到购物中心的电器店购买  
     public void EleStore()  
    {  
        Ele c = new Ele();  
        c.getEle();  //购买到电器  
    }  
     
    //到购物中心的首饰店购买  
    public void JewelryStore()  
    {  
        Jewelry c = new Jewelry();  
        c.getJewelry();  //购买到首饰  
    }  
} 

客户端代码:

    ShopingCenter sc = new ShopingCenter();  
    sc.clothingStore();  
    sc.EleStore();  
    sc.JewelryStore(); 

看这个例子:

package pattern.facade;
/**
 * 门面模式/外观模式:Facade Pattern
 *
 * 保安系统:
 * 一个保安系统由两个录像机、一个感应器和一个报警器组成。
 * 由保安操作仪器的启动和关闭:没有使用门面模式时,保安必须亲自启动每个仪器。
 * @version 2009-6-15
 * @author Winty(wintys@gmail.com)
 */
public class FacadeTest{
    public static void main(String[] args){
        //无门面模式
        Camera camera1,camera2;
        camera1 = new Camera();
        camera2 = new Camera();
        
        Sensor sensor;
        sensor = new Sensor();

        Alarm alarm;
        alarm = new Alarm();

        //启动仪器
        camera1.turnOn();
        camera2.turnOn();
        sensor.activate();
        alarm.activate();
        System.out.println("");

        /
        //使用门面模式
        SecurityFacade security = new SecurityFacade();
        security.start();
    }
}

/**
 * 门面:Facade
 */
class SecurityFacade{
    private Camera camera1;
    private Camera camera2;
    private Sensor sensor;
    private Alarm alarm;

    public SecurityFacade(){
        camera1 = new Camera();
        camera2 = new Camera();
        sensor = new Sensor();
        alarm = new Alarm();
    }
    //启动
    public void start(){
        camera1.turnOn();
        camera2.turnOn();
        sensor.activate();
        alarm.activate();
    }

    //停止
    public void stop(){
        camera1.turnOff();
        camera2.turnOff();
        sensor.deactivate();
        alarm.deactivate();
    }
}

class Camera{
    public void turnOn(){
        System.out.println("turn on the Camera.");
    }

    public void turnOff(){
        System.out.println("turn off the Camera.");
    }

    //转动
    public void rotate(){
        System.out.println("rotate the Camera.");
    }
}


class Sensor{
    public void activate(){
        System.out.println("activate the sensor.");
    }

    public void deactivate(){
        System.out.println("deactivate the sensor.");
    }

    //触发感应器
    public void trigger(){
        System.out.println("trigger the sensor.");
    }
}

class Alarm{
    public void activate(){
        System.out.println("activate the alarm.");
    }

    public void deactivate(){
        System.out.println("deactivate the alarm.");
    }

    //拉响报警器
    public void ring(){
        System.out.println("ring the alarm.");
    }
}


运行结果:

turn on the Camera.

turn on the Camera.

activate the sensor.

activate the alarm.

turn on the Camera.

turn on the Camera.

activate the sensor.

activate the alarm.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值