关闭

外观模式(门面模式)---脸有时比才华更重要

标签: 设计模式外观模式门面模式Java
129人阅读 评论(0) 收藏 举报
分类:
        声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333
        外观模式也称作门面模式,是指对外提供一个专门操作内部子系统的外观类,外观类本身是并不涉及具体的业务逻辑的。举个生活中常见的例子,
    平时大街上的自动售货机,就可以说是使用了外观模式,用户只要选择相应的物品就可以买到自己想要的商品,至于怎么买到的,用户不用关心,
    由自动售货机内部自己实现。
public class VendingMachine {
    public static void main(String[] args) {
        //自动售货机的橱窗
        ShowCase showCase = new ShowCase();
        //买水
        showCase.buyWater();
        //买汽水
        showCase.buySoda();
        //买果汁
        showCase.buyJuice();
    }
}

/**
 * @introduce:展示的橱窗,相当于外观类
 * 
 */
class ShowCase {
    SellWater water = new SellWater();
    SellSoda soda = new SellSoda();
    SellJuice juice = new SellJuice();

    void buyWater() {
        water.method();
    }

    void buySoda() {
        soda.method();
    }

    void buyJuice() {
        juice.method();
    }
}

/**
 * @introduce:出售水
 * 
 */
class SellWater {
    void method() {
        System.out.println("获得了水");
    }
}

/**
 * @introduce:出售汽水
 * 
 */
class SellSoda {
    void method() {
        System.out.println("获得了汽水");
    }
}

/**
 * @introduce:出售果汁
 * 
 */
class SellJuice {
    void method() {
        System.out.println("获得了果汁");
    }
}

控制台输出:
获得了水
获得了汽水
获得了果汁

    代码很简单,结果也很明显,上面的就是最简单的外观模式了,通过外观类,避免了高层模块和底层模块的直接接触(解耦)。
    由于很多人一次性买的种类不是只有一种,要求向外提供个同时能购买水和果汁的按钮(或者是其他组合类似),这时代码应该怎么改,
我的第一想法是在外观类中添加个方法
    void buyWaterAndJuice() {
        water.method();
        juice.method();
    }
    只要在橱窗类中调用该方法,就能满足要求了。虽然要求是满足了不过这里会产生一个倒依赖的问题:要同时购买水和果汁就只能通过橱窗类,
相当于底层系统要依赖外观类才能被访问。这是不符合外观类的设计原则的,也违反了单一职责原则,想想如果别的对方发现该系统很好用,
只会将你的内部实现方法拿过去,不可能将你的橱窗也搬过去。而不将橱窗也拿过去就没法提供同时能购买水和果汁的功能了(因为该方法写在橱窗类中了)。
    写了这么多,就是为了说明一件事,外观类不要参与到具体的业务逻辑,只是提供个访问内部系统的路径就好。上面的问题(同时能购买水和果汁的功能)要解决也简单,
重新构建一个出售水和果汁的类。
/**
 * @introduce:出售水和果汁
 * 
 */
class SellWaterAndJuice {
    SellWater water = new SellWater();
    SellJuice juice = new SellJuice();

    void method() {
        water.method();
        juice.method();
    }
}
外观类改为:
/**
 * @introduce:展示的橱窗,相当于外观类
 * 
 */
class ShowCase {
    SellWater water = new SellWater();
    SellSoda soda = new SellSoda();
    SellJuice juice = new SellJuice();
    SellWaterAndJuice waterAndJuice = new SellWaterAndJuice();

    void buyWater() {
        water.method();
    }

    void buySoda() {
        soda.method();
    }

    void buyJuice() {
        juice.method();
    }

    void buyWaterAndJuice() {
         waterAndJuice.method(); 
    }
}
这样一来,自动售货机就提供了同时购买水和果汁的功能,也避免了上面描述的倒依赖问题。
参考大牛链接:http://www.cnblogs.com/zuoxiaolong/p/pattern12.html
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

医院的例子   现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门...
  • jason0539
  • jason0539
  • 2014-04-02 07:16
  • 25110

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是在现阶段各种第三方 SDK 基本很大概率都会使用外观模式。通过一个外观类使得整个系统...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-07-17 18:14
  • 3396

设计模式(七)门面模式(Facade Pattern 外观模式)

一、模式定义门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更...
  • xingjiarong
  • xingjiarong
  • 2015-11-28 16:14
  • 7173

Facade 外观(门面)模式

Facade模式为子系统提供统一的对外接口,某种意义上讲,它代表着这个子系统。简化外部对子系统访问的复杂度。一个外观模式类封装了子系统对外的访问接口,但这并不完全隔断外部对子系统的接口调用,外部子系统...
  • golb_05
  • golb_05
  • 2011-10-15 15:36
  • 180

Facade(外观模式,门面模式)

名  称 Facade(外观模式,门面模式) 意  图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 适  用 环  境 u...
  • wkcgy
  • wkcgy
  • 2011-06-22 08:40
  • 411

门面模式(外观Facade模式)

外观模式UML图 外观模式UML 定义 外观模式(也成为门面模式)要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。它提供一个高层次的接口,使得子系统更易于使用 类型...
  • Hynial
  • Hynial
  • 2015-08-16 08:05
  • 293

门面模式/外观模式

原文链接:http://www.tutorialspoint.com/design_pattern/facade_pattern.htm Facade Pattern(门面模式/外观模式) 隐藏了系...
  • shfqbluestone
  • shfqbluestone
  • 2016-05-11 09:47
  • 743

外观模式(门面模式)

医院的例子   现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、...
  • lhm2016
  • lhm2016
  • 2017-12-26 10:06
  • 10

Java设计模式——门面(外观)模式(Facade Pattern)

场景一 描述:好,我们继续讲课。大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,...
  • u012401711
  • u012401711
  • 2016-09-21 22:59
  • 234

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

一、定义         外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,...
  • u012243115
  • u012243115
  • 2015-05-28 15:59
  • 306
    个人资料
    • 访问:14435次
    • 积分:627
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    最新评论