美文网首页Java基础
设计模式3.7 门面模式

设计模式3.7 门面模式

作者: 卢卡斯哔哔哔 | 来源:发表于2018-12-02 22:37 被阅读0次

    点击进入我的博客

    门面模式(Facade Pattern)要求一个子系统的外部与其内部通信,必须通过一个统一的门面对象进行。

    3.7.1 门面模式结构

    门面模式没有一个一般化的类图描述,可以用下面的例子来说明。


    门面模式
    • 门面(Facade)角色:外部可以调用这个角色的方法。此角色知道子系统的功能和责任。
    • 子系统(Subsystem)角色:可以有多个子系统,子系统不需要知道门面的存在。

    3.7.2 细节

    门面数量

    通常只需要一个门面类,而且只有一个实例,因此可以设计称单例模式。当然也可有多个类。

    使用场景
    1. 为一个复杂的子系统提供一个简单的接口
    2. 使子系统和外部分离开来
    3. 构建一个层次化系统时,可以使使用Facade模式定义系统中每一层,实现分层。
    优点
    1. 减少系统之间的相互依赖。
    2. 提高了安全性。
    缺点
    1. 不符合开闭原则
    2. 如果要改东西很麻烦,继承重写都不合适。
    Java例子

    MVC三层结构

    3.7.3 KFC例子

    假如没有服务员(门面),顾客(外部系统)要点一个套餐需要知道每个套餐包含的食物(子系统)种类,这样就会非常麻烦,所以最好的方式是直接告诉服务员套餐名称就好了。

    public class Customer {
        public static void main(String[] args) {
            Waiter waiter = new Waiter();
            List<Food> foodList = waiter.orderCombo("Combo1");
        }
    }
    
    abstract class Food {}
    class MiniBurger extends Food {}
    class MexicanTwister extends Food {}
    class CornSalad extends Food {}
    class HotWing extends Food {}
    class PepsiCola extends Food {}
    
    class Waiter {
        public List<Food> orderCombo(String comboName) {
            List<Food> foodList;
            switch (comboName) {
                case "Combo1" : 
                    foodList = Arrays.asList(new MiniBurger(), new CornSalad(), new PepsiCola()); 
                    break;
                case "Combo2":
                    foodList = Arrays.asList(new MexicanTwister(), new HotWing(), new PepsiCola());
                    break;
                default:
                    foodList = new ArrayList<>();
            }
            return foodList;
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式3.7 门面模式

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