八、外观模式——设计模式学习笔记 - Go语言中文社区

八、外观模式——设计模式学习笔记


作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。
最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。

1.外观模式 Facade Pattern

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2.uml类图

这里写图片描述

3.组成

(1)外观类(Facade)

它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。为子系统提供一个共同的对外接口。

(2)子系统类集合(SubSystem Classes)

实现子系统的功能,处理Facade对象指派的任务,注意子类中没有Facade的任何信息,即没有对Facade对象的引用。

(3)客户端(Clients)

客户对象通过一个外观接口读写子系统中各接口的数据资源。

4.优点

  • 实现了子系统与客户端之间的松耦合关系。
  • 客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

5.应用场景

  • 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。比如经典的三层架构,考虑在数据访问层、业务逻辑层和表示层的层与层之间建立外观Facade。
  • 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口,减少依赖降低耦合。
  • 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

6.实例

(1)菜品子系统类集合

package com.longinus.fp;
public class BigFrenchFries {
    public void sell(){
        System.out.print("大薯 ");
    }
}
package com.longinus.fp;
public class MidFrenchFries {
    public void sell(){
        System.out.print("中薯 ");
    }
}
package com.longinus.fp;
public class MinFrenchFries {
    public void sell(){
        System.out.print("小薯条 ");
    }
}
package com.longinus.fp;
public class Hamburger {
    public void sell(){
        System.out.print("热辣鸡腿堡  ");
    }
}
package com.longinus.fp;
public class FriedChicken {
    public void sell(){
        System.out.print("吮指原味鸡 ");
    }
}
package com.longinus.fp;
public class Cola {
    public void sell(){
        System.out.print("可乐 ");
    }
}

(2)kfc窗口类

package com.longinus.fp;
public class KfcFacade {
    Hamburger hb;
    BigFrenchFries bf;
    MidFrenchFries mdf;
    MinFrenchFries mif;
    FriedChicken fc;
    Cola ca;

    public KfcFacade(){
        hb = new Hamburger();
        bf = new BigFrenchFries();
        mdf = new MidFrenchFries();
        mif = new MinFrenchFries();
        fc = new FriedChicken();
        ca = new Cola();
    }

    public void SetMealA(){
        System.out.print("你购买了套餐A:");
        hb.sell();
        mdf.sell();
        ca.sell();
        System.out.println();
    }

    public void SetMealB(){
        System.out.print("你购买了套餐B:");
        mif.sell();
        System.out.println();
    }

    public void SetMealC(){
        System.out.print("你购买了套餐C:");
        fc.sell();
        bf.sell();
        ca.sell();
        System.out.println();
    }
}

(3)测试类

package com.longinus.fp;
public class Test {
    public static void main(String[] args) {
        KfcFacade kfc = new KfcFacade();
        kfc.SetMealC();
    }
}

(4)输出结果

你购买了套餐C:吮指原味鸡 大薯 可乐 
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/L0nginus/article/details/74078882
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-05 17:16:43
  • 阅读 ( 1639 )
  • 分类:设计模式

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢