设计模式面试系列-03

1. Java 中如何实现模板方法模式?

举例:去餐厅吃饭,餐厅给我们提供了一个模板就是:看菜单,点菜,吃饭,付款,走人。注意这里“点菜和付款”是不确定的由子类来完成的,其他的则是一个模板。

1、先定义一个模板。把模板中的点菜和付款,让子类来实现。

package com.yoodb.blog;//模板方法
public abstract class RestaurantTemplate {// 1.看菜单public void menu() {System.out.println("看菜单");}// 2.点菜业务abstract void spotMenu();// 3.吃饭业务public void havingDinner(){ System.out.println("吃饭"); }// 3.付款业务abstract void payment();// 3.走人public void GoR() { System.out.println("走人"); }//模板通用结构public void process(){menu();spotMenu();havingDinner();payment();GoR();}
}

2、具体的模板方法子类

package com.yoodb.blog;public class RestaurantGinsengImpl extends RestaurantTemplate {void spotMenu() {System.out.println("人参");}void payment() {System.out.println("5快");}
}

3、具体的模板方法子类

package com.yoodb.blog;public class RestaurantLobsterImpl  extends RestaurantTemplate  {void spotMenu() {System.out.println("龙虾");}void payment() {System.out.println("50块");}
}

4、测试

package com.yoodb.blog;public class Client {public static void main(String[] args) {RestaurantTemplate restaurantTemplate = new RestaurantGinsengImpl();restaurantTemplate.process();}
}

2. Java 中什么是外观模式?

外观模式又叫门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。

外观模式是为了解决类与类之家的依赖关系的,为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。外观模式是一种结构型模式。

使用外观模式,它外部看起来就是一个接口,其实他的内部有很多复杂的接口已经被实现。

3. Java 中外观模式有什么使用场景?

1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。

2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

3、当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。

4. Java 中如何实现外观模式?

Java中实现外观模式实例代码,关注微信公众号Java精选,有详细源码分析。

1、接口A,具体代码如下:

package com.yoodb.blog;  public interface ServiceA {  /** * ServiceA 的A方法  * */  public void methodA() ;  
}  

2、接口A实现类,具体代码如下:

package com.yoodb.blog;  public class ServiceAImpl implements ServiceA {  /* (non-Javadoc) * @see com.yoodb.blog.ServiceA#methodA() */  @Override  public void methodA() {  
System.out.println( "methodA--> is runing" );   }  }  

3、接口B,具体代码如下:

package com.yoodb.blog;  public interface ServiceB {  /** * ServiceB 的B方法 * */  public void methodB() ;  
}  

4、接口B实现类,具体代码如下:

package com.yoodb.blog;  public class ServiceBImpl implements ServiceB {  /* (non-Javadoc) * @see com.yoodb.blog.ServiceA#methodA() */  @Override  public void methodB() {  
System.out.println( "methodB--> is runing" );   }  }  

5、接口C,具体代码如下:

public interface ServiceC {  /** * ServiceC 的C方法 * */  public void methodC() ;    
}  

6、接口C实现类,具体代码如下:

package com.yoodb.blog;  public class ServiceCImpl implements ServiceC {  /* (non-Javadoc) * @see com.yoodb.blog.ServiceA#methodA() */  @Override  public void methodC() {  
System.out.println( "methodC--> is runing" );    }  }  

7、外观模式,核心实现代码如下:

package com.yoodb.blog;  public class Facade {  ServiceA sa;  ServiceB sb;  ServiceC sc;  public Facade() {  
sa = new ServiceAImpl();  
sb = new ServiceBImpl();  
sc = new ServiceCImpl();  }  public void methodA() {  
sa.methodA();  
sb.methodB();  }  public void methodB() {  
sb.methodB();  
sc.methodC();  }  public void methodC() {  
sc.methodC();  
sa.methodA();  }  }  

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

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

相关文章

IP 协议

IP 协议 .IP协议格式四位版本号四位首部长度8位服务类型16位总长度16位标识符,3位标志位,13位片偏移8位生存时间TTL8位协议16位首部校验和32位源地址 32位目的地址IP地址的组成特殊的IP地址 . IP协议格式 四位版本号 用来表示IP协议的版本,现有的IP协议只有两个版本,IPv4,IPv6…

comfyui节点编写示例文件(下)

** 1、先看示例文件的结构 ** ** 2、设置输入参数 ** ** 3、节点指定任务、输出啥 ** ** 4、这个节点干了啥,定义函数、输出结果 ** ** 5、多个节点,就多个类 ** ** 6、设置多个入口 ** ** 7、放置 ** 直接把py文件放到 .\Co…

PostgreSQL教程(四):高级特性

一、简介 在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识。现在我们将要讨论SQL中一些更高级的特性,这些特性有助于简化管理和防止数据丢失或损坏。最后,我们还将介绍一些PostgreSQL扩展。 本章有时将引用教程&#xff0…

消息中间件之RocketMQ为什么写文件这么快?

RocketMQ的存储涉及中,很大一部分是基于Kafka的涉及进行优化的。 PageCache 现代操作系统内核被设计为按照Page读取文件,每个Page默认4KB, 因为程序一般符合局部性原理,所以操作系统在读取一段文件内容时,会将该段内容和附件的文…

Nginx网络服务二-----(虚拟机和location)

一、HTTP设置 1.设置虚拟主机 1.1Nginx 基于域名---虚拟主机 include /apps/nginx/conf.d/*.conf; 1.2Nginx 基于端口---虚拟主机 在做了域名的基础上,按照以下步骤继续 1.3Nginx 基于IP---虚拟主机 2.server下的root root路径格式 指定文件的路径 url …

DataX学习详解

参考视频 02_DataX_概述_哔哩哔哩_bilibili 参考文档 大数据技术之DataX-阿里云开发者社区 介绍 DataX 是阿里巴巴开源的一个 异构数据源 离线 同步工具 致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP,MongDB等各种异构数据源之间…

[python][whl]PyOpenGL轮子文件whl格式所有版本含python3.12版本下载地址汇总

以下PyOpenGL都是windows x64系统使用pyopengl注意对应版本下载,文件名命名规则为,以PyOpenGL-3.1.6-cp312-cp312-win-amd64.whl为例子 PyOpenGL:python模块名称 3.1.6:pyopengl版本号 cp312:表示支持python3.12版本不支持其他…

五、深入学习TensorRT,Developer Guide篇(四)

上一篇文章我们介绍了C的API,这篇文章我们主要针对的是Python的API,起始C和Python在整体流程上面基本一致,但是由于Python天然的简洁性和易用性,Python的API相对来讲还是比较简单的,我们一起来看一下吧。 文章目录 4.…

windows下快速安装nginx 并配置开机自启动

1、下载地址:http://nginx.org/en/download.html 2、启动nginx 注意⚠️ 不要直接双击nginx.exe,这样会导致修改配置后重启、停止nginx无效,需要手动关闭任务管理器内的所有nginx进程。 在nginx.exe目录,打开命令行工具&#xf…

【springblade】springblade(bladeX) 数据权限失效原因分析

文章目录 数据权限接口权限 前言:最近博主在按照bladeX官方文档 配置数据权限 结果发现失效了,网上搜了一下没找到合适的答案,本着求人不如求己的精神,自己调试了一下发现了问题所在,也大致看了一下bladeX的权限逻辑。…

代码随想录算法训练营29期Day56|LeetCode 300,674,718

文档讲解:最长递增子序列 最长连续递增序列 最长重复子数组 300.最长递增子序列 题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/ 思路: 设dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长…

unity——shader入门知识点 学习笔记【个人复习向/侵删/有不足之处欢迎斧正】

零、不同图形接口程序对Shader开发的影响: 1.渲染管线(流水线)和图形接口程序的关系:图形接口程序(OpenGL、 DX等)提供了对渲染管线(流水线)的控制和管理功能,它是开发者和硬件打交道的中间层 2. Shader和图形接口程序的关系&#xf…

计算机毕业设计 基于SpringBoot的宠物商城网站系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

LeetCode206反转链表

LeetCode206,直接看下面链接的动画演示部分就行了,就能快速理解pre和cur的作用 代码随想录:反转链表 这个是另外的在B站的视频讲解链接 【帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法】 https://www.bilibili.com/video/BV1nB4y1i7eL/?share_so…

Linux理解

VMware安装Linux安装 目录 VMware安装Linux安装 1.1 什么是Linux 1.2 为什么要学Linux 1.3 学完Linux能干什么 2.1 主流操作系统 2.2 Linux系统版本 VMware安装Linux安装 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。 1.2 为什么要学Linux 1). 企业用人…

Python3获取办公室IP并更新至腾讯云安全组

需求来源: 由于云服务器的安全组限制了只能在公司IP下远程连接,每次更新安全组时只能通过手动更新,办公室IP是动态IP,每隔三天变一次IP,时间久了就觉得麻烦,所以在查阅了腾讯云文档后发现有安全组的SDK&…

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容,后面会将,主要是用来进行追踪的。 4.配置name和email 当然也…

Node.js的debug模块源码分析及在harmonyOS平台移植

Debug库 是一个小巧但功能强大的 JavaScript 调试工具库,可以帮助开发人员更轻松地进行调试,以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句,同时在不需要调试时可以轻松地禁用它们,以避免在生产环境中对性…

室内外一体化定位系统

随着科技的不断发展,定位系统已经成为了人们生活中不可或缺的一部分。无论是在户外还是室内,定位服务都给人们带来了极大的便利。然而,传统的定位系统主要集中在室外环境,对于室内环境的定位还存在一定的困难。因此,室…

深度优先搜索-DFS

介绍 英文全称:Deep First Search 枚举所有完整路径来遍历所有情况的搜索方法 return不同情况的介绍 问题描述 在n件物品中,输入其容量与价值。给定容量,求物品的价值之和最大值。 思路 用DFS思想来看,每件物品有选择与不选择…