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

本文介绍了软件设计中的外观模式,包括其定义、组成、优点及应用场景。并通过一个快餐店点餐系统的实例,展示了如何通过外观模式简化子系统接口,提高系统的易用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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:吮指原味鸡 大薯 可乐 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值