门面模式

       小时候快过春节了,爸妈都要给我们一身新,那时候有意思了,我们全家浩浩荡荡,去一个店买完衣服,再到另一个店挑鞋子,还要辗转换几家店子去选玩具。我妈妈又喜欢砍价,每次讲下一块钱她都眉开眼笑,似乎很有成就感。这一逛一讲,基本上一天就过去了,折腾的人受不了。那时候我就想啊,要有家综合型店子能够卖所有我需要的东西,还不许还价。呵呵,那我就开心了。这个呢,就是我们今天要讲的主题:门面模式。

 

       先来看看生活中门面模式的例子:

 

三国时,曹操接见匈奴使者,他觉得自己相貌不好,不足以用威仪震慑匈奴使者,于是命帅哥崔琰假扮自己,充当门面,曹操本人则提刀立于床头,装作侍从的样子。你看,曹操不愧一代英雄,这么早就会用门面模式了。

 

我们现在都喜欢用照相机,专业摄影人士总是选择自己调节光圈,调节焦距,开闪光灯,设置其它一些复杂的参数。而我们大部分人都只是使用自动拍照功能:取景,按快门就OK了,其它一切复杂的动作都被隐藏起来。这就是摄影上门面模式的运用。

 

还有很多门面模式的例子:新生报道,由父母打头阵,帮忙处理一系列繁杂的手续;医院就诊,安排接待员,由接待员负责代为挂号、划价、缴费、取药等;记者采访,通过新闻发言人,让记者们不用四处奔波,就可以获得政府各大职能部门最新最准确的信息等。

 

怎么样,现在你应该对门面模式有了基本的认识了吧。我们来看设计模式中的门面模式。

 

什么是门面模式?

 

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

就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。

 

门面模式的结构

 

这里,我们不知不觉的用到了一个法则:Law Of Demeter(中文名:迪米特法则)。

 

迪米特法则最初是由Han Holland1987年在美国Northeastern University做一个名为Demeter的项目时提出来的,这个法则有以下几个表达方式:

1、只和你的朋友们通信。

2、不要和陌生人讲话。

3每一个软件单位对其他的单位都只有最少的知识,而且仅局限于那些与本单位密切相关的软件单位。

 

门面模式是代码重构以达到迪米特法则要求的一个强有力的武器。

 

下图演示了一个门面模式的示意性对象图:

 

 

在这个对象图中,出现了两个角色:

 

门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

 

       好啦,我们来做一个简单的JAVA实例,满足我儿时的心愿:

 

Java代码

package com.wepull.facade;

 

/**

 * @author leno 服装店

 */

public class Clothing {

   public void getClothing() {

      System.out.println("买衣服");

   }

}

package com.wepull.facade;

 

/**

 * @author leno 鞋店

 */

public class Shoes {

   public void getShoes() {

      System.out.println("买鞋子");

   }

}

package com.wepull.facade;

 

/**

 * @author leno 玩具店

 */

public class Toy {

   public void getToys() {

      System.out.println("买玩具");

   }

}

 public class Clothing

{

    public Clothing getClothing()

    {

        return Clothing;

    }

}

 

//电器类

public class Ele

{

    public Ele getEle()

    {

        return Ele;

    }

}

 

//首饰类

public class Jewelry

{

    public Jewelry getJewelry()

    {

        return Jewelry;

    }

}

/**--------------------------按照传统方式---------------------------*/

package com.wepull.facade;

 

/**

 * @author leno 买主

 */

public class Buyer {

 

   public void buy() {

      // 先到服装店

      Clothing clothing = new Clothing();

      clothing.getClothing();// 购买到衣服

      // 再到鞋店

      Shoes shoes = new Shoes();

      shoes.getShoes();// 购买到鞋子

      // 还要去玩具店

      Toy toy = new Toy();

      toy.getToys();// 购买到玩具

   }

}

 

 public class Buy

{

    //你需要到服饰店

    Clothing c = new Clothing();

    c.getClothing();  //购买到衣服

 

     //接着去电器店

     Ele c = new Ele();

    c.getEle();  //购买到电器

 

     //然后去首饰店

     Jewelry c = new Jewelry();

    c.getJewelry();  //购买到首饰

}

这样客户类和后台交互很频繁,很枯燥,而且你需要和一个一个商店类打交道,很麻烦,那就换一种方式 /**--------------------------按照门面模式---------------------------*/

Java代码

package com.wepull.facade;

 

/**

 * @author leno 购物中心

 */

public class ShopingCenter {

 

   // 到购物中心的服饰店购买

   public void clothingStore() {

      Clothing clothing = new Clothing();

      clothing.getClothing();// 购买到衣服

   }

 

   // 到购物中心的鞋店购买

   public void shoesStore() {

      Shoes shoes = new Shoes();

      shoes.getShoes();// 购买到鞋子

   }

 

   // 到购物中心的玩具店购买

   public void toysStore() {

      Toy toy = new Toy();

      toy.getToys();// 购买到玩具

   }

}

 

好了,现在直接去购物中心,不用一家一家跑了

 

Java代码

package com.wepull.facade;

 

/**

 * @author leno 买主

 */

public class Buyer {

 

   public void buy() {

      ShopingCenter center = new ShopingCenter();

      center.clothingStore();

      center.shoesStore();

      center.toysStore();

   }

}

      “金玉其外,败絮其中。这句话对门面模式倒是可以解释。金玉其外指的就是门面,是调用者能看到的,是简单特定的接口。败絮其中指的就是复杂且全面的接口对象,里面有复杂的逻辑和结构,对调用者来说,是不可见的。如果调用者不通过门面类而直接调用子系统的接口,那就是很头疼的事。一叶障目,不见泰山。这就是门面模式的作用。好了,你又掌握了一种设计模式,继续修炼吧。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值