设计模式之外观模式(门面模式)

外观模式真是比单例模式还要简单了,毕竟单例还有八种写法

简介

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

实例探究

假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。关闭也是如此。

但是实际上我们在电脑开/关机时根本不需要去操作这些组件,因为电脑已经帮我们都处理好了,并隐藏了这些东西。

这些组件好比子系统角色,而电脑就是一个外观角色。


SubSystem 子系统角色

public class CPU {
    public void startup(){
        System.out.println("cpu startup!");
    }
    public void shutdown(){
        System.out.println("cpu shutdown!");
    }
}

public class Memory {
    public void startup(){
        System.out.println("memory startup!");
    }
    public void shutdown(){
        System.out.println("memory shutdown!");
    }
} 

public class Disk {
    public void startup(){
        System.out.println("disk startup!");
    }
    public void shutdown(){
        System.out.println("disk shutdown!");
    }
}

Facade 外观角色

public class Computer {
    private CPU cpu;
    private Memory memory;
    private Disk disk;  

    public Computer(){
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }  

    public void startup(){
        System.out.println("start the computer!");
        cpu.startup();
        memory.startup();
        disk.startup();
        System.out.println("start computer finished!");
    }  

    public void shutdown(){
        System.out.println("begin to close the computer!");
        cpu.shutdown();
        memory.shutdown();
        disk.shutdown();
        System.out.println("computer closed!");
    }
}

具体调用如下:

Computer computer = new Computer();
computer.startup();
computer.shutdown();

小结:

  • 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复 杂性
  • 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展
  • 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
  • 当系统需要进行分层设计时,可以考虑使用Facade模式
  • 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时 可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口, 让新系统与Facade类交互,提高复用性
  • 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。 要以让系统有层次,利于维护为目的。

原文地址:https://www.cnblogs.com/heliusKing/p/11966899.html

时间: 2024-10-01 20:45:28

设计模式之外观模式(门面模式)的相关文章

外观模式 门面模式 Facade 创建型 设计模式(十三)

外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本上都是会往功能更全面的方向发展,那么也就意味着我们的系统将会变得更加复杂. 系统会被划分为多个单独的子系统,每个子系统完成一部分功能,通过分工协作完成全部功能. 一个子系统也可能进一步拆分为更小的几个子系统. 程序中的文件将会越来越多,相互关联也会变得更加复杂 当使用一个功能的时候,作为客户端 你需

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 门面(Facade)模式(译者注:facade有些书籍译为门面,有些书籍译为外观,此处译为门面) 门面模式针对复杂的子系统提供了单一的接口,不需要暴漏一些列的类和API给用户,你仅仅暴漏一个简单统一的API. 下面的图解释了这个概念: 这个API的使用者

设计模式(七)门面模式(Facade)-结构型

门面模式Facade 门面模式:统之间的接口.框架之间的衔接 (1)使用接口的形式来开发,不需要知道接口中内部方法的实现: (2)门面模式就是为子系统对外提供的一组接口提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成. (3)当一个负载的系统需要对外提供接口时,就需要将对提供的接口统一封装在外观类里,供外系统使用. 门面模式原理图 门面模式原理图 不用门面设计模式的情况 Holiday.java public class Holiday { public double g

设计模式--结构模式--门面模式

一.基本概念 1.外观模式(Facade),也被称为"门面模式".定义了一个高层.统一的接口,外部通过这个统一的接口对子系统中的一群接口进行访问. 2.角色 A:外观(Facade)角色:为多个子系统对外提供一个共同的接口. B:子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它. C:客户(Client)角色:通过一个外观角色访问各个子系统的功能. 二.例子. 分诊台作为患者和医生的装饰. A:外观(Facade)角色: 1 package comm.

混合模式(策略模式+工厂方法模式+门面模式)

使用这三种模式设计一个简单的计算器程序:计算器是用于计算数值之间进行数学计算后所获得的值.它包含基本的"加减"功能.以上对以上需求进行分析可以得出计算有两种策略(+与-). 计算策略的实现: /*抽象策略*/public interface Strategy{ /*定义了计算策略所拥有的算法*/ public int calculate(int a,int b);} /*加法策略的实现*/public class AddStrategy implements Strategy{ @Ov

外观模式(门面模式)

//飞机 public class Plane { public void buyTicket(){ System.out.println("订购飞机票"); } } //火车 public class Train { public void buyTicket(){ System.out.println("订购火车票"); } } //景点 public class Scenery { public void buyTicket(){ System.out.pri

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---门面模式之HomeTheater[转]

  1unit uSubObject;  2  3interface  4  5type  6  7  { TAmplifier与TTuner,TCDPlayer,TDVDPlayer相互依赖.            }  8  { 在TTuner等的简单实现时用不到对TAmplifier的引用,               }  9  { 但现实生活中就应该让TAmplifier提供服务,所以这里保留了.       } 10  { TProjector对TDVDPlayer的引用也是同样道理

JS常用的设计模式(7)—— 外观模式

外观模式(门面模式),是一种相对简单而又无处不在的模式.外观模式提供一个高层接口,这个接口使得客户端或子系统更加方便调用.用一段再简单不过的代码来表示 var getName = function(){ return ''svenzeng" } var getSex = function(){ return 'man' } 如果你需要分别调用getName和getSex函数. 那可以用一个更高层的接口getUserInfo来调用. var getUserInfo = function(){ va

设计模式之门面模式

门面模式 门面模式是把具体的实现放在自己内部,对外提供一个外观给外部去调用.让使用者可以很方便地使用它.这样可以做到内部的变更交给内部自己去处理,使得责任单一.也让我们的系统不需要暴露太多的细节给外部. 实例代码 public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { t