zoukankan      html  css  js  c++  java
  • 结构型模式之外观

    外观(Facade)模式又称门面模式,感觉这是设计模式中一个比较容易理解的模式,GOF对其所起作用描述为:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。Facade的形象化描述可以借用GOF一书中的插图进行表述,如下:

    《Java与模式》一书中举了一个例子,就是医院就诊问题,如果说医院是一个系统的话,其中各个室相当于一个子系统,运营管理差的医院可能需要病人自行去办理各个室的业务,运营管理好的医院则可以为病人提供有关接待员,由这个接待员为病人办理相关手续,病人不需要折腾地去与各个室打交道,而且病人也不了解各个室的情况,由接待员办理岂不是效率更高,这个接待员就相当于Facade,也就是医院系统的外观,它能与医院的子系统进行交互,而不需要病人亲自去与子系统交互。 

                                              

    对上述例子的代码实现效果如下:

     1 class Patients{
     2     private Server server;
     3     public Patients(Server server){
     4         this.server=server;
     5     }
     6     public void kanbin(){
     7         System.out.println("我要看病");
     8         server.server();
     9     }
    10 }
    11 class Server{
    12     public void server(){
    13         System.out.println("我是接待员,我来为您服务");
    14         (new GuaHao()).guahao();
    15         (new MenZen()).menzen();
    16         (new HuaJia()).huajia();
    17         (new QuYao()).quyao();        
    18     }
    19 }
    20 class MenZen{
    21     public MenZen(){}
    22     public void menzen(){
    23         System.out.println("门诊");
    24     }
    25 }
    26 class GuaHao{
    27     public GuaHao(){}
    28     public void guahao(){
    29         System.out.println("挂号");        
    30     }
    31 }
    32 class QuYao{
    33     public QuYao(){}
    34     public void quyao(){
    35         System.out.println("取药");    
    36     }
    37 }
    38 class HuaJia{
    39     public HuaJia(){}
    40     public void huajia(){
    41         System.out.println("划价");
    42     }
    43 }
    44 public class Test{
    45     
    46     public static void main(String[] args){
    47         Patients p=new Patients(new Server());
    48         p.kanbin();
    49         }
    50 }
    View Code

    通常来说,只需要一个Facade,因此Facade的设计经常设计为单例模式,但是这里没给出那么具体的实现,从宏观上讲,外观模式提供的是一种封装,将子系统进行“封装”起来(这些子系统有各自的定义),在设计原则中,有一个“迪米特法则”,就是“只与你直接的朋友通信”,只要可能,朋友越少越好,因为这也就意味着系统耦合度降低,不管怎样,我们都应该尽量避免不必要的直接通信。

  • 相关阅读:
    迭代器接口
    实现Promise
    学学springboot吧!!!!
    了解一下连接池!!!!
    Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules ???报错!!!
    requset和response的区别????
    百度也太神奇了吧
    这个svn啊,真的是有点看不懂
    BootStrap???确实厉害
    突然看到原来除了jar包还有war包啊?????
  • 原文地址:https://www.cnblogs.com/codeMedita/p/7356375.html
Copyright © 2011-2022 走看看