设计模式 - 外观模式

目录

    • 什么是外观模式?
    • 解决问题
    • 结构图
    • 注意点
    • 代码
    • 总结:

什么是外观模式?

定义了一个高层、统一的接口,外部与通过这个统一的接口对子系统中的一群接口进行访问。通过创建一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以通过调用外观类的方法来调用内部子系统中所有方法

解决问题

● 避免了系统与系统之间的高耦合度
● 使得复杂的子系统用法变得简单

结构图

设计模式 - 外观模式_第1张图片

注意点

从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。

Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。

Façade设计模式并非一个集装箱,可以任意地放进任何多个对象。Façade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。

注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

代码

● 背景:小成的爷爷已经80岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;
● 冲突:行动不方便,走过去关闭那么多电器很麻烦,代码如下:

 //灯类
        public class SubSystemA_Light
        {
            public void on()
            {
                Console.WriteLine("打开了灯....");
            }

            public void off()
            {
                Console.WriteLine("关闭了灯....");
            }
        }

        //电视类
        public class SubSystemB_Television
        {
            public void on()
            {
                Console.WriteLine("打开了电视....");
            }

            public void off()
            {
                Console.WriteLine("关闭了电视....");
            }
        }

        //空调类
        public class SubSystemC_Aircondition
        {
            public void on()
            {
                Console.WriteLine("打开了空调....");
            }

            public void off()
            {
                Console.WriteLine("关闭了空调....");
            }
        }

        public class Facade
        {

            SubSystemA_Light light;
            SubSystemB_Television television;
            SubSystemC_Aircondition aircondition;


            //传参
            public Facade(SubSystemA_Light light, SubSystemB_Television television, SubSystemC_Aircondition aircondition)
            {
                this.light = light;
                this.television = television;
                this.aircondition = aircondition;

            }
            //起床后一键开电器
            public void on()
            {
                Console.WriteLine("起床了");
                light.on();
                television.on();
                aircondition.on();

            }

            public void off()
            {
                //睡觉时一键关电器
                Console.WriteLine("睡觉了");
                light.off();
                television.off();
                aircondition.off();
            }



            public static void Main(String[] args)
            {
                {
                    //实例化电器类
                    SubSystemA_Light light = new SubSystemA_Light();
                    SubSystemB_Television television = new SubSystemB_Television();
                    SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition();

                    //传参
                    Facade facade = new Facade(light, television, aircondition);

                    //客户端直接与外观对象进行交互
                    facade.on();
                    Console.WriteLine("可以看电视了");
                    facade.off();
                    Console.WriteLine("可以睡觉了");
                }

总结:

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。通过使用外观模式,客户端可以简化和减少与子系统的直接交互,从而降低了系统的复杂性。

外观模式从多个维度来介绍如下:

  1. 定义:外观模式通过提供一个统一的接口,封装了一组复杂子系统的功能。它隐藏了子系统的复杂性,使得客户端可以更加方便地使用子系统。

  2. 结构:外观模式包含三个角色:外观(Facade)、子系统(SubSystem)和客户端(Client)。外观角色封装了一组子系统的接口,客户端通过外观角色来访问子系统。子系统角色实现了具体的功能,客户端通过外观角色来间接地使用子系统。

  3. 优点:

    • 简化接口:外观模式提供了一个简单的接口,隐藏了子系统的复杂性,使得客户端可以更加方便地使用子系统。
    • 解耦:外观模式将客户端与子系统解耦,使得客户端不需要直接与子系统交互,降低了客户端与子系统之间的依赖关系。
    • 提高灵活性:外观模式可以随时调整子系统的实现,而不会影响客户端的代码。
  4. 缺点:

    • 违反开闭原则:如果需要新增或修改子系统的功能,可能需要修改外观角色的代码,违反了开闭原则。
    • 可能引入不必要的复杂性:如果子系统的接口很简单,使用外观模式可能会引入不必要的复杂性。
  5. 适用场景:

    • 当一个系统有多个子系统,并且客户端需要直接与多个子系统交互时,可以使用外观模式来简化客户端的代码。
    • 当需要对子系统进行封装,以降低客户端与子系统之间的耦合度时,可以使用外观模式。
    • 当需要将子系统的接口进行统一封装,以提供一个简单的接口给客户端使用时,可以使用外观模式。

外观模式的使用场景包括:

  1. 简化复杂系统:当一个系统变得非常复杂,包含多个子系统和相互关联的类时,可以使用外观模式来提供一个简单的接口,隐藏系统的复杂性,使得客户端可以更容易地使用系统。

  2. 提供统一接口:当一个系统中的一组接口需要被统一使用时,可以使用外观模式来封装这些接口,提供一个统一的接口给客户端使用。

  3. 解耦客户端和子系统:当客户端需要依赖多个子系统时,可以使用外观模式来解耦客户端和子系统之间的依赖关系,减少耦合度。

  4. 对子系统进行封装:当需要对一个子系统进行封装,隐藏其内部的实现细节时,可以使用外观模式来提供一个简单的接口给客户端使用。

  5. 系统升级和维护:当系统需要升级或者维护时,可以使用外观模式来封装变化,降低对客户端的影响,提高系统的可维护性和可扩展性。

总之,外观模式适用于需要简化复杂系统、提供统一接口、解耦客户端和子系统、对子系统进行封装、系统升级和维护等场景。

你可能感兴趣的:(设计模式,外观模式,设计模式)