2 结构型模式之 - 外观模式

外观模式的介绍:外观模式在开发运用中的频率非常高,尤其是现阶段各种第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式,通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能够降低用户使用的复杂度,也对用户屏蔽了很多实现细节,当然 ,在我们的开发过程中,外观模式也是我们封装API的常用手段,例如网络模块,ImageLoader模块等。可能你已经在开发中运用过无数次外观模式,只是没有理论层面上认识它,本章我们就从理论与实践相结合的方式来理解外观模式

外观模式的定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式(Facade模式)提供一个高层次的接口,使得子系统更加的易用。

外观模式的使用场景:

1 为一个或者多个子系统提供一个简单接口。子系统往往不断深化变得越来越复杂,甚至可能被替换,大多数模式使用时都会产生更多,更小的类,在这类子系统更具有重用性的同时也更容易对子系统进行定制,修改,这种易变性使得隐藏子系统的具体实现显得很重要,Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现,隔离变化 。

2 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade接口进行通信,从而简化它们之间的依赖关系

我们就以一个简单的例子来说明外观模式:

我们先定义3个子系统,这3个子系统必须相互配合才能完成一件事,这3个子系统代码如下:

 1 /**
 2  * 子系统A
 3  */
 4 public class SystemA {
 5
 6     public void doSomething1(){
 7         System.out.println("SystemA 业务逻辑1");
 8     }
 9
10     public void doSomething2(){
11         System.out.println("SystemA 业务逻辑2");
12     }
13
14     public void doSomething3(){
15         System.out.println("SystemA 业务逻辑3");
16     }
17
18 }
 1 /**
 2  * 子系统B
 3  */
 4 public class SystemB {
 5
 6     public void doSomething1(){
 7         System.out.println("SystemB 业务逻辑1");
 8     }
 9
10     public void doSomething2(){
11         System.out.println("SystemB 业务逻辑2");
12     }
13
14     public void doSomething3(){
15         System.out.println("SystemB 业务逻辑3");
16     }
17
18 }
 1 /**
 2  * 子系统C
 3  */
 4 public class SystemC {
 5
 6     public void doSomething1(){
 7         System.out.println("SystemC 业务逻辑1");
 8     }
 9
10     public void doSomething2(){
11         System.out.println("SystemC 业务逻辑2");
12     }
13
14     public void doSomething3(){
15         System.out.println("SystemC 业务逻辑3");
16     }
17
18 }

这三个子系统完成了,我们必须要这几个子系统共同配合才能完成一件事,代码是这样的。如下:

 1     //正常情况下,这3个子系统需要配合才能完成一件事
 2     public static void testNormal(){
 3         SystemA systemA = new SystemA();
 4         SystemB systemB = new SystemB();
 5         SystemC systemC = new SystemC();
 6
 7         //这些子系统一块才能完成一个功能
 8         systemA.doSomething1();
 9         systemA.doSomething2();
10         systemA.doSomething3();
11
12         systemB.doSomething1();
13         systemB.doSomething2();
14         systemB.doSomething3();
15
16         systemC.doSomething1();
17         systemC.doSomething2();
18         systemC.doSomething3();
19     }

如上面的代码所示,这样调用起来很复杂,也很容易出错,如果我们用外观模式,把这些子系统给包装起来,提供一个统一的接口来访问,就简单多了,代码如下 :

 1 /**
 2  *
 3  * 外观模式是一种使用频率非常高的结构型设计模式,
 4  * 它通过引入一个外观角色来简化客户端与子系统之间的交互,
 5  * 为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便
 6  */
 7 public class Facade {
 8     private SystemA systemA = new SystemA();
 9     private SystemB systemB = new SystemB();
10     private SystemC systemC = new SystemC();
11
12
13     public void doSomething(){
14
15         //这些子系统一块才能完成一个功能
16         systemA.doSomething1();
17         systemA.doSomething2();
18         systemA.doSomething3();
19
20         systemB.doSomething1();
21         systemB.doSomething2();
22         systemB.doSomething3();
23
24         systemC.doSomething1();
25         systemC.doSomething2();
26         systemC.doSomething3();
27     }
28 }

如上,这样的话,一个外观类提供一个简单的接口,将各个子系统的逻辑,交互隐藏起来,为用户提供一个统一的高层次的接口,使用起来也简单很多,用户也不会感觉到,因为我们使用的是外观模式,内部的变化对用户来说并不可见的,使得系统更加的灵活。

时间: 2024-12-10 13:38:50

2 结构型模式之 - 外观模式的相关文章

结构型设计模式之外观模式

结构 意图 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越复杂.大多数模式使用时都会产生更多更小的类.这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难.F a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过f

java-设计模式(结构型)-【外观模式】

1.外观模式(Facade) 最少知道原则:一个类应该尽可能少的与其他类发生相互作用,使类相对独立,系统功能模块相对独立. 定义:减少类与类之间的依赖关系,就像Spring一样,可以将类和类之间的关系配置到配置文件中. 而外观模式则是将它们类之间的关系放入一个Facade类中,降低类与类之间的耦合度,该模式没有涉及接口.  2.图解 public class Computer { //各个部件(类) private CPU cpu=new CPU(); private Memory m=new

14结构型模式之外观模式

概念  Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种.Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面.这个一致的简单的界面被称作facade. 角色和职责 Fa?ade 为调用方, 定义简单的调用接口. Clients 调用者.通过Facade接口调用提供某功能的内部类群. Packages 功能提供者.指提供功能的类群(模块或子系统) 适用于: 为子系统中统一一套接口,让子系统更加容易使用. 案例 //实现多个子系统的封装 #i

设计模式(7)--适配式模式与外观模式

转换接口. 引入新原则: " 最少知识"原则   作用为 外观模式 面向对象的适配器:将一个接口转换成另一个接口,以符合客户的期望. 对象适配器  与  类适配器 OO原则:(1)封装变化 (2)多用组合,少用继承 (3)针对接口编程,不针对实现编程 (4)为交互对象之间的松耦合设计而努力 (5)类应该对扩展开放,对修改关闭.(6) 依赖抽象,不要依赖具体类.(7)只和朋友交流. OO模式: 适配器模式-:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无

结构型模式之 外观模式

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一种对象结构型模式. 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序.依赖

结构型模式之外观模式

概述 外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道 定义 为子系统中的一组接口提供一个统一的入口.外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 实现 子系统 /// <summary> /// 注册账号类 /// </summary> public class RegistAccount { /// <summary>

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有

设计模式(结构型)之装饰者模式(Decorator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之组合模式(Composite Pattern)>http://blog.csdn.net/yanbober/article/details/45392513 概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为.装饰模式是一种用于替代继承