设计模式-外观模式

作者: KevinLive | 来源:发表于2017-07-20 18:10 被阅读55次

最近习惯了自己做饭,虽然做饭的过程很痛苦,可是看到自己做出来的美食后,还是很幸福很有成就感的。就拿自己做饭吃和去餐馆吃饭来举例,把餐馆看做外观角色,让它把买菜、切菜、炒菜、刷碗这些工作统一组织起来,我要做的就是告诉他要吃什么就行了,下面是示例代码:

SubSystem 类:

// 买菜
public class BuyVegetable {
    public void buy() {
        LogUtils.i("买菜");
    }
}

// 切菜
public class CutVegetable {
    public void cut() {
        LogUtils.i("切菜");
    }
}

// 炒菜
public class CookVegetable {
    public void cook() {
        LogUtils.i("炒菜");
    }
}

// 洗刷刷
public class WashDishes {
    public void wash() {
        LogUtils.i("洗刷刷");
    }
}

Facade 类:

// 餐馆
public class Restaurant {

    private final BuyVegetable mBuyVegetable;
    private final CutVegetable mCutVegetable;
    private final CookVegetable mCookVegetable;
    private final WashDishes mWashDishes;

    public Restaurant() {
        mBuyVegetable = new BuyVegetable();
        mCutVegetable = new CutVegetable();
        mCookVegetable = new CookVegetable();
        mWashDishes = new WashDishes();
    }

    public void eat() {
        mBuyVegetable.buy();
        mCutVegetable.cut();
        mCookVegetable.cook();
        mWashDishes.wash();
    }
}

Client 类:

// 自己做饭,需要跟这些子系统交互
BuyVegetable buyVegetable = new BuyVegetable();
CutVegetable cutVegetable = new CutVegetable();
CookVegetable cookVegetable = new CookVegetable();
WashDishes washDishes = new WashDishes();
buyVegetable.buy();
cutVegetable.cut();
cookVegetable.cook();
washDishes.wash();

// 去餐馆吃饭,只需跟餐馆交互
Restaurant restaurant = new Restaurant();
restaurant.eat();

有了外观模式,需要交互的类就变成了一个,让它负责和业务类实现交互,简化负责的交互,降低系统的耦合度,但是在标准的外观模式中,如果需要增删改外观类交互的子系统类,就需要改动客户端源码,这样就违反了“开闭原则”,因此遇到此类情况需要引入抽象外观类进行优化,还以上面例子为基础:

AbstarctFacade 类:

public abstract class AbstractFacade {
    public abstract void eat();
}

ConcreteFacade 类:

// 有些不用切就可以直接做的饭,比如面,这就需要把切菜移除掉
public class NoodlesRestaurant extends AbstractFacade{

    private final BuyVegetable mBuyVegetable;
    private final CookVegetable mCookVegetable;
    private final WashDishes mWashDishes;

    public NoodlesRestaurant() {
        mBuyVegetable = new BuyVegetable();
        mCookVegetable = new CookVegetable();
        mWashDishes = new WashDishes();
    }

    @Override
    public void eat() {
        mBuyVegetable.buy();
        mCookVegetable.cook();
        mWashDishes.wash();
    }
}

Client 类:

AbstractFacade abstractFacade = new NoodlesRestaurant();
abstractFacade.eat();

<h3> 优点 </h3>

  • 屏蔽子系统,减少客户端所需交互的对象,简化调用
  • 降低客户端与子系统耦合,面对子系统变化,只需要调整外观类即可
  • 子系统间的修改不会相互影响

<h3> 缺点 </h3>

  • 不能很好限制客户端直接使用子系统类,对访问子系统类做过多限制则减少可变性和灵活性
  • 设计不当时,增加新的子系统需要修改外观类源码,违背开闭原则

<h3> 使用场景 </h3>

  • 需要访问一系列子系统完成业务需求
  • 客户端和多个子系统很高的耦合,使用外观模式解耦,提高子系统的独立性和可移植性
  • 层次化结构中,使用外观模式定义系统中每层的入口,层与层之间不直接产生联系,通过外观类建立联系,降低层之间的耦合

源码地址:Github

相关文章

  • Android设计模式——外观模式(七大结构型)

    1.外观模式介绍 外观模式(Facade Pattern),是七大结构型设计模式之一。 外观模式运...

  • 设计模式[9]-外观模式-Facade Pattern

    1. 外观模式 外观模式(Facade Pattern),又称为门面模式,是非常常用的结构性设计模式。外观模式使得...

  • java设计模式-外观模式(Facade)

    外观模式,属于结构性模式。属于设计模式里面比较简单的设计模式,本人认为是最简单的设计模式。 所谓外观,就是我们能看...

  • 了解外观模式

    java 设计模式 ------外观模式 Java中一共有23种设计模式,每种设计模式各有特...

  • 设计模式之-4.外观模式

    每看一次设计模式,感觉每一个设计模式看起来是那么简单,对于外观模式我的理解就是外观模式:外观模式,这个名字起得不怎...

  • 设计模式详解——外观模式

    本篇文章介绍一种设计模式——外观模式。本篇文章内容参考《JAVA与模式》之门面模式,外观模式,深入浅出外观模式(二...

  • 外观模式(Facede)

    本文参考自: 《JAVA设计模式》之外观模式(Facade) 1. 作用 外观模式也叫门面模式,门面模式是对象的结...

  • 设计模式---外观模式

    1、外观模式(Facade):也叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个...

  • 设计模式——外观模式

    阎宏博士的《JAVA与模式》一书中开头是这样描述外观(Facade)模式的:门面模式是对象的结构模式,外部与一个子...

  • 设计模式--外观模式

    一、举个栗子小明每天回家都会先打开灯,空气净化器,电热水器烧上水,放上音乐,如果天气热的话,再打开空调。写成代码 ...

网友评论

    本文标题:设计模式-外观模式

    本文链接:https://www.haomeiwen.com/subject/jpsjkxtx.html