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

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

 

目录

外观模式(Facade Pattern)

类图

例子1:

过程:

类图:

代码:

订酒店:Hotel

订飞机:Airport

接送: Charffeur

订景点: TouristSpot

接待外观:ReceptorFacade

测试:

结果:

总结:

使用场景


外观模式(Facade Pattern)

定义: Provide a unified interface to a set of interfaces in a subsystem. Façade defines a higher-level interface that makes the subsystem easier to use.

 

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。

意图:提供子系统的一个简化接口。 提供一个简单的接口,好让一个子系统更易于使用

类图

外观模式通用类图

 

 

例子1:

过程:

旅游,旅游可以自己安排,也可以选择抱团旅游,让旅游团的人安排。自己安排要买车票,订旅馆,考虑吃的。抱团的话,都是旅游团的人安排,这时候旅游团的人相当于外观模式,事情会打理好。

  自己安排的话:

 

报团:

 

类图:

 

代码:

订酒店:Hotel

public class Hotel {
    public void bookRoom(int days) {
        System.out.println("订了" + days + "天的酒店");
    }
}

 

订飞机:Airport

public class Airport {
    public void bookTicket(String from, String to) {
        System.out.println("订购了从" + from + "到" + to + "的机票");
    }
}

 

接送: Charffeur

public class Charffeur {
    public void drive() {
        System.out.println("专职司机开车去机场接");
    }
}

 

订景点: TouristSpot

public class TouristSpot {
    public void bookSpot(String address) {
        System.out.println("选择了去旅游景点" + address + " 游玩");
    }
}

 

接待外观:ReceptorFacade

public class ReceptorFacade {
    //定义可以操作的对象
    private Charffeur charffeur = new Charffeur();
    private Hotel hotel = new Hotel();
    private Airport airport = new Airport();
    private TouristSpot touristSpot = new TouristSpot();

    //安排旅游,实际是调用不同对象做特定的事情
    public void travel(String to, int days) {
        airport.bookTicket("上海", to);
        charffeur.drive();
        hotel.bookRoom(days);
        touristSpot.bookSpot("九寨沟,乐山大佛");
    }
}

 

测试:

public class TouristTest {
    public static void main(String[] arg) {
        System.out.println("报团去四川游玩一周");
        ReceptorFacade receptorFacade = new ReceptorFacade();
        receptorFacade.travel("四川", 7);
    }
}

 

结果:

报团去四川游玩一周

订购了从上海到四川的机票

专职司机开车去机场接

订了7天的酒店

选择了去旅游景点九寨沟,乐山大佛 游玩

  

总结:

   外观模式比较简单,主要是思想 —-- 提供一个统一的访问接口。

优点: 

   1、减少系统相互依赖。

   2、提高灵活性。

   3、提高了安全性。

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

 

使用场景

  1,为一个复杂的模块或子系统提供一个供外界访问的接口

  2,子系统相对独立——外界对子系统的访问只要黑箱操作即可

比如利息的计算问题,没有深厚的业务知识和扎实的技术水平是不可能开发出该子系统的,但是对于使用该系统的开发人员来说,他需要做的就是输入金额以及存期,其他的都不用关心,返回的结果就是利息,这时候,门面模式是非使用不可了。

  3,预防低水平人员带来的风险扩散

比如一个低水平的技术人员参与项目开发,为降低个人代码质量对整体项目的影响风险,一般的做法是“画地为牢”,只能在指定的子系统中开发,然后再提供门面接口进行访问操作。

   4,在维护一个遗留的大型系统时,可能这个系统以及非常难以维护和扩展了,但是它包含非常重要的功能,新的需求开发必须要依赖于它。你可以为新系统开发一个外观Façade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Façade对象交互,Façade与遗留代码交互所有复杂的工作。

 

简单地说,门面对象是外界访问子系统内部的唯一通道,不管子系统内部是多么杂乱无章,只要有门面对象在,就可以做到“金玉其外,败絮其中”

注意:

   在门面模式中,门面角色应该是稳定,它不应该经常变化,一个系统一旦投入运行它就不应该被改变,它是一个系统对外的接口,你变来变去还怎么保证其他模块的稳定运行呢?但是,业务逻辑是会经常变化的,我们已经把它的变化封装在子系统内部,无论你如何变化,对外界的访问者来说,都还是同一个门面,同样的方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值