首页 > 其他分享 >03.外观模式

03.外观模式

时间:2023-05-31 13:00:10浏览次数:43  
标签:03 外观 模式 子系统 接口 模块 Facade public

外观式定义

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

界面

在这里提到的界面,主要指的是从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,也就是所说的外观。

接口

在这里提到的接口,主要指的是外部和内部交互的这么一个通道,通常是指一些方法,可以是类的方法,也可以是 interface 的方法。也就是说,这里所说的接口,并不等价于 interface,也有可能是一个类。

外观模式的结构和说明

Facade

定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。

模块

接受 Facade 对象的委派,真正实现功能,各个模块之间可能有交互。
但是请注意,Facade 对象知道各个模块,但是各个模块不应该知道 Facade 对象。

代码示例

using System;

namespace NetCore3Console.Facade
{
    /// <summary>
    /// A模块的接口
    /// </summary>
    public interface AModuleApi
    {
        /// <summary>
        /// 示意方法,A模块 对外的一个功能方法
        /// </summary>
        void TextA();
    }

    public class AModuleImpl : AModuleApi
    {
        public void TextA()
        {
            Console.WriteLine("现在在A模块里面操作testA方法");
        }
    }

    /// <summary>
    /// B模块的接口
    /// </summary>
    public interface BModuleApi
    {
        /// <summary>
        /// 示意方法,A模块 对外的一个功能方法
        /// </summary>
        void TextB();
    }

    public class BModuleImpl : BModuleApi
    {
        public void TextB()
        {
            Console.WriteLine("现在在B模块里面操作testB方法");
        }
    }

    /// <summary>
    /// C模块的接口
    /// </summary>
    public interface CModuleApi
    {
        /// <summary>
        /// 示意方法,A模块 对外的一个功能方法
        /// </summary>
        void TextC();
    }

    public class CModuleImpl : CModuleApi
    {
        public void TextC()
        {
            Console.WriteLine("现在在B模块里面操作testC方法");
        }
    }

    /// <summary>
    /// 外观对象
    /// </summary>
    public class Facade
    {
        /// <summary>
        /// 示意方法,满足客户需要的功能
        /// </summary>
        public void Test()
        {
            //在内部实现的时候,可能会调用到内部的多个模块
            AModuleApi a = new AModuleImpl();
            a.TextA();
            BModuleApi b = new BModuleImpl();
            b.TextB();
            CModuleApi c = new CModuleImpl();
            c.TextC();
        }
    }
}

模式讲解

外观模式的目的

外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交瓦,松散耦合,从而让外部能够更简单地使用子系统。

外观模式的实现

Facade的实现

对于一个子系统而言,外观类不需要很多,通常可以实现成为一个单例。也可以直接把外观中的方法实现成为静态的方法,这样就可以不需要创建外观对象的实例而直接调用,这种实现相当于把外观类当成一个辅助工具类实现。

Facade的方法实现

Facade的方法实现中,一般是负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade 的方法本身并不进行功能的处理,Facade 的方法实现只是实现一个功能的组合调用。

思考外观模式

外观模式的本质

外观模式的本质是:封装交互,简化调用。

Facade 封装了子系统外部和子系统内部多个模块的交互过程,从而简化了外部的调用。通过外观,子系统为外部提供一些高层的接口,以方便它们的使用。

对设计原则的体现

外观模式很好地体现了“最少知识原则”。


外观模式就是新添加了个Facede类,在这里面组合调用其他方法呀。

标签:03,外观,模式,子系统,接口,模块,Facade,public
From: https://www.cnblogs.com/huiteresa/p/17445826.html

相关文章

  • Could not find the DLL(s) 'msvcp140_1.dll'. TensorFlow requires that these DLLs
      python-c"fromtransformersimportpipeline;print(pipeline('sentiment-analysis')('weloveyou'))"MicrosoftVisualC++Redistributableisnotinstalled,thismayleadtotheDLLloadfailure.                Itcanbedow......
  • 享元模式
    一、定义运用共享技术有效地支持大量细粒度的对象。二、适用场景系统会用到大量相同或相似的对象。对象创建比较耗时。三、目的减少创建对象的数量。对象全局共享。四、UML类图FlyweightFactory:享元工厂,用来创建并管理Flyweight对象Flyweight:享元类的基类或接口C......
  • 解释器模式(Interpreter Pattern)
    解释器模式(InterpreterPattern)一、定义解释器模式(InterpreterPattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等。给定一个语言,定义它的文法的一种表示,并定义......
  • JS的严格模式
    JavaScript的严格模式(StrictMode)是一种在代码中启用的特殊模式,用于提供更严格的语法和错误检查,以改善代码质量和增强安全性。使用严格模式可以帮助大家避免一些常见的错误,并禁用一些不推荐使用的特性。要启用严格模式,可以在代码的顶部或函数体的开头添加以下语句:"usestrict";......
  • 算法学习day34贪心part03-1005、134、135
    packageLeetCode.greedypart03;/***1005.K次取反后最大化的数组和*给你一个整数数组nums和一个整数k,按以下方法修改该数组:*选择某个下标i并将nums[i]替换为-nums[i]。*重复这个过程恰好k次。可以多次选择同一个下标i。*以这种方式修改数组后,返回......
  • AtCoder Beginner Contest 303
    A-SimilarString(abc303a)题目大意给定两个字符串,问这两个字符串是否相似。两个字符串相似,需要每个字母,要么完全相同,要么一个是1一个是l,要么一个是0一个是o解题思路按照题意模拟即可。可以将全部1换成l,全部0换成o,再判断相等。神奇的代码#include<bits/stdc++.h>us......
  • Abstract Factory Pattern 抽象工厂模式简介与 C# 示例【创建型】【设计模式来了】
    〇、简介1、什么是抽象工厂模式?一句话解释:  通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问。抽象工厂模式(AbstractFactoryPattern)是一种创建型模式。它用于创建一组相关对象的家族。强调的是一组对象之间的协作关系,而不是单个对象之......
  • 范式关系模式
    第一NF---消除部分依赖-->第二NF--消除传递依赖-->第三NF-->决定因素(关系中左边的)要包含主码-->BCNF举例1.AB->D,B->D存在D对主码AB的部分依赖,不符合第二范式,为第一范式改为第三范式:R1(A,B,D)R2(B,D)2.AB->C,AB->D,AD->E,不存在部分依赖,但存在E对主码AB的传递依赖吗,不符合第三......
  • 003_HelloWorld
    003_HelloWorld写一个HelloWorld。代码publicclassHello{publicstaticvoidmain(String[]args){System.out.print("HelloWorld!");}}编译javac执行javaHello......
  • 新版idea快捷键总结学习----(用于java开发模式)
    选择代码区ctrlw如果放到以if开头的语句,可以选择if判断条件所在的代码片段游标在单个单词下时选择单词在选中多个单词时,选择整个字符串三次点击时,如果不在字符串单词下,用于选择{}内的代码片段逐级递增如果在单词下方,用于选择单词所在的字符串并且向外逐级扩展。ctrl......