Go和Java实现外观模式

Go和Java实现外观模式

下面我们通过一个构造各种形状的案例来说明外观模式的使用。

1、外观模式

外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型

模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

  • 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统

    更加容易使用。

  • 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

  • 何时使用:1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统

    的入口。

  • 如何解决:客户端不与系统耦合,外观类与系统耦合。

  • 关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

  • 应用实例:1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供

    接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。

  • 优点:1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

  • 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

  • 使用场景:1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来

    的风险。

  • 注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。

  • 适用性:

    当你要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用

    时都会产生更多更小的类,这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定

    制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户来说

    已经足够,而那些需要更多的可定制性的用户可以越过 facade 层。

    客户程序与抽象类的实现部分之间存在着很大的依赖性,引入 facade 将这个子系统与客户以及其他的子系统

    分离,可以提高子系统的独立性和可移植性。

    当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点,如果子系统之间是相

    互依赖的,你可以让它们仅通过 facade 进行通讯,从而简化了它们之间的依赖关系。

2、Go实现外观模式

package facade//  ========== Shape ==========
type Shape interface {draw()
}
package facadeimport "fmt"// ========== Circle ==========
type Circle struct {
}func (circle *Circle) draw() {fmt.Println("Circle::draw()")
}
package facadeimport "fmt"// ========== Rectangle ==========
type Rectangle struct {
}func (rectangle *Rectangle) draw() {fmt.Println("Rectangle::draw()")
}
package facadeimport "fmt"// ========== Square ==========
type Square struct {
}func (Square *Square) draw() {fmt.Println("Square::draw()")
}
package facade// ========== ShapeFacade ==========
type ShapeFacade struct {circle    Circlerectangle Rectanglesquare    Square
}func NewShapeFacade() ShapeFacade {return ShapeFacade{circle:    Circle{},rectangle: Rectangle{},square:    Square{},}
}func (shapeFacade *ShapeFacade) DrawCircle() {shapeFacade.circle.draw()
}func (shapeFacade *ShapeFacade) DrawRectangle() {shapeFacade.rectangle.draw()
}func (shapeFacade *ShapeFacade) DrawSquare() {shapeFacade.square.draw()
}
# 输出
Circle::draw()
Rectangle::draw()
Square::draw()

3、Java实现外观模式

package facade;//  ========== Shape ==========
public interface Shape {void draw();
}
package facade;// ========== Rectangle ==========
public class Rectangle implements Shape{@Overridepublic void draw() {System.out.println("Rectangle::draw()");}
}
package facade;// ========== Circle ==========
public class Circle implements Shape{@Overridepublic void draw() {System.out.println("Circle::draw()");}
}
package facade;// ========== Square ==========
public class Square implements Shape{@Overridepublic void draw() {System.out.println("Square::draw()");}
}
package facade;// ========== ShapeFacade ==========
public class ShapeFacade {private Shape circle;private Shape rectangle;private Shape square;public ShapeFacade() {circle = new Circle();rectangle = new Rectangle();square = new Square();}public void drawCircle(){circle.draw();}public void drawRectangle(){rectangle.draw();}public void drawSquare(){square.draw();}
}
package facade;public class Test {public static void main(String[] args) {ShapeFacade shapeFacade = new ShapeFacade();shapeFacade.drawCircle();shapeFacade.drawRectangle();shapeFacade.drawSquare();}
}
# 输出
Circle::draw()
Rectangle::draw()
Square::draw()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 意图:为其他对象提供一种代理以…

【面试问题】事务中执行了异步任务分发数据,由于事务未提交,导致异步任务无法执行

文章目录 问题描述:解决办法: 问题描述: OverrideTransactional(rollbackFor Exception.class)public ServiceResponse ctsqCallbackProcess(OaFlowRecord params) {// 查询任务单数据// 更新任务单信息// 异步分发数据到CRMS系统}客户数据分…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web应用程序或服务的服务器端组件。它是一个完全可编程的ASP.NET文字处理引擎,提供了广泛的文字处理功能。使用TX Text Control.NET Server,程序员可以开发…

react组件化开发详解

React是一个流行的JavaScript库,用于构建用户界面,并且以组件化的方式进行开发。下面将详解React组件化开发的概念和步骤: 组件化思维: 组件化开发是将复杂的用户界面划分为独立、可重用的小部件(组件)。…

【833. 字符串中的查找与替换】

来源:力扣(LeetCode) 描述: 你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources, targets。 要完成第 i 个替换操作: 检查…

Spring事务传播机制

hi ,大家好,继续为大家带来Spring事务传播机制的相关知识 文章目录 🤗1.事务传播机制是什么🤗2.事务传播机制作用🤗3.事务传播机制 🤗1.事务传播机制是什么 定义了多个包含了事务的⽅法,相互调⽤时,事务是…

C++教程 - How to C++系列专栏第3篇

关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第0篇,点击C教程 - How to C系列专栏第0篇去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴…

[C++ 网络协议编程] UDP协议

目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…

从安全角度分析Angular本地存储

随着Web应用程序的不断增长,前端开发人员慢慢意识到使用浏览器提供的本地存储技术可以在不使用外部数据库的情况下方便地保存应用程序的数据。Angular作为目前最流行的前端框架之一,也在其API中提供了许多本地存储技术的支持。但是,在使用本地…

Electron教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Electron是一个是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron 通过将 Chromium 和 Node.js 合并到同一个运行时环境中,并将其打包为 Mac,Windows 和 Linux 系统下的应用来实现这一目的。 Electron入门教程 …

【深度学习】日常笔记16

可以将pd.DataFrame数据结构理解为类似于Excel中的表格。pd.DataFrame是pandas库提供的一个二维数据结构,用于存储和操作具有行和列的数据。它类似于Excel中的工作表,其中每一列可以是不同的数据类型(例如整数、浮点数、字符串等)…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar,jar方式 背景 在开发的过程中,主项目引入三方功能的方式有很多,主要是以下几个方面: (1)直接引入源代码module(优点:方便修改源码,易于维护&#…

Spring_AOP

一、AOP简介 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程0OP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象…

算法训练营题目day17

110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 func isBalanced(root *TreeNode) bool {h:getHeight(root)if h -1{r…

Vue 安装开发者工具

1.下载开发者工具,下载地址:http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器,点击扩展,点击管理扩展程序。 3.开启开发者模式,将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章,全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见:《chatGPT小白快速入门课程大纲》。 本系列文章,参与: AIGC征文活动 #AIGC技术创作内容征文# …

使用pymupdf实现PDF内容搜索并显示功能

简介: 在日常工作和学习中,我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件,并结合wxPython构建一个用户友好的…

动态HTTP代理与竞争情报收集的关联

Hey,各位爬友们!作为一名专业的爬虫HTTP代理提供者,今天我要和大家聊一聊动态HTTP代理与竞争情报收集之间的关联。在这篇文章中,我将向大家解释怎么使用动态HTTP代理完成在竞争中的情报收集,并分享一些实用的技巧。 首…

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到,虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用,尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣,可以点击文末相关链接进行回顾! 而今天,虹科将继续给大家带来Router系列在各个领域的…

Netty:判断ByteBuf底层是否被NIO direct buffer支撑

说明 io.netty.buffer.ByteBuf的函数isDirect()可以判断该ByteBuf底层是否被NIO direct buffer支撑。如果结果返回true,表示底层被NIO direct buffer支撑。 示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; imp…