Java设计模式-外观模式

简介

在软件开发过程中,经常会遇到复杂的系统和庞大的类库。这些系统往往包含了大量的类和子系统,给开发人员带来了挑战。为了简化接口设计和提高系统的可用性,设计模式提供了一种名为外观模式的解决方案。

外观模式是一种结构型设计模式,旨在为复杂系统提供一个简化的接口。该模式通过隐藏底层系统的复杂性,提供一个更简单、更易于使用的接口给客户端。外观模式是一种封装模式,通过封装底层子系统的复杂性,将其对客户端的可见性降低,从而降低了系统的耦合性。

与其他设计模式的区别: 外观模式与其他设计模式有一些区别。下面是外观模式与一些常见设计模式的对比:

  1. 外观模式 vs. 适配器模式: 适配器模式旨在解决接口不兼容的问题,它将一个类的接口转换成客户端所期望的接口。而外观模式是为了简化复杂系统的接口设计,提供一个更高层次的接口给客户端。
  2. 外观模式 vs. 单例模式: 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。外观模式是一种结构型设计模式,用于简化接口。这两种模式在目的和实现上有所不同。
  3. 外观模式 vs. 组合模式: 组合模式旨在以树形结构组织对象,形成部分-整体的层次结构。外观模式主要用于简化接口,将复杂系统隐藏在一个统一的接口后面。

实现

下面是使用Java编程语言实现外观模式的示例代码:

// 子系统接口
interface SubsystemA {
    void operationA();
}

interface SubsystemB {
    void operationB();
}

// 子系统实现
class ConcreteSubsystemA implements SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA operation");
    }
}

class ConcreteSubsystemB implements SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB operation");
    }
}

// 外观类
class Facade

 {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;

    public Facade() {
        subsystemA = new ConcreteSubsystemA();
        subsystemB = new ConcreteSubsystemB();
    }

    public void operation() {
        subsystemA.operationA();
        subsystemB.operationB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation();
    }
}

优缺点

优点

  1. 简化接口:外观模式为复杂系统提供一个简化的接口,使得客户端更容易使用系统。
  2. 降低耦合性:通过将子系统封装在一个外观类中,降低了系统各个组件之间的耦合性。
  3. 提高灵活性:外观模式使得修改系统变得更容易,因为客户端只需要与外观类交互,而不需要了解子系统的细节。

缺点

  1. 可能导致性能问题:如果外观类的设计不合理,可能会导致性能问题,因为外观类可能成为系统的瓶颈。
  2. 不符合开闭原则:当系统中新增或修改功能时,可能需要修改外观类,违反了开闭原则。

运用场景

外观模式适用于以下场景:

  1. 当存在复杂的子系统,并且需要为客户端提供一个简化的接口时。
  2. 当需要将系统的层次结构和依赖关系与客户端代码解耦时。
  3. 当希望隐藏底层系统的实现细节,并提供一个统一的接口给客户端时。

总结

外观模式是一种结构型设计模式,旨在简化复杂系统的接口设计。通过隐藏底层系统的复杂性,外观模式提供了一个统一、简化的接口给客户端,使得客户端更容易使用系统,并降低系统各个组件之间的耦合性。

外观模式的核心思想是将系统的复杂性封装在一个外观类中,客户端只需要与外观类交互,而不需要了解子系统的具体实现细节。这种封装提供了许多优点。首先,它简化了客户端的使用,使得客户端不需要关注底层系统的复杂性,减少了开发人员的工作量和学习成本。其次,外观模式降低了系统的耦合性,因为客户端只与外观类进行交互,而不需要直接与子系统进行通信。这样,系统的变化对客户端的影响较小,提高了系统的灵活性和可维护性。

然而,外观模式也有一些缺点需要考虑。首先,不合理的设计可能导致外观类成为系统的瓶颈,影响系统的性能。因此,在设计外观类时需要注意性能优化。其次,当系统需要新增或修改功能时,可能需要修改外观类,违反了开闭原则。因此,在使用外观模式时需要仔细考虑系统的变化和扩展性。

外观模式适用于存在复杂子系统、需要简化接口、降低耦合性、隐藏系统实现细节的场景。它在许多应用中得到广泛应用,例如大型软件系统、类库、API等。

通过合理地应用外观模式,我们可以简化系统接口设计,提高系统的可用性和灵活性,并降低系统的耦合性。外观模式是一种强大的工具,可以帮助开发人员处理复杂性,提高开发效率,为软件系统的设计和维护提供便利。

本文转载于网络 如有侵权请联系删除

相关文章

  • 从开关到系统

    朋友老胡出差了,嫂子说家里灯坏了,听说我是卖开关的,让我去看看。修完电灯已经很晚了,嫂子留我吃晚饭,正好乘此机会在嫂子面前展示下工控技术!从开关说起众所周知家里的电灯只需要接通零线和火线就会亮,通过开关控制火线的通断达到控制电灯亮与灭。在工业上,电动机的启动与停止也会通过电路上开关的通断来控制,这里的开关一般是指断路器开关,在100A以内的为小型断路器,100A-630A常用塑壳断路器,630A以上大电流一般用到框架式开关了,施耐德NS系列塑壳断路器可以做到1600A。国内工业上用到的品牌有施耐德、西门子、ABB等一线合资品牌,价格稍贵质量过硬,国内常熟、上联等品牌经过市场几十年的考验,成为了国内一线,德力西、众泰、天正等后起之秀也在工业和民用上广受欢迎。如果电动机功率大的话,负载启动电流会到达平时的5-7倍,我们直接用空气开关控制电动机的启动停止会产生电弧火花!威胁生产作业安全。这时我们的接触器就出场了,接触器可以由小电流控制快速切断和导通主电路,从而控制电动机的启动停止,通常电路会搭配热继电器使用,热继电器是用于电动机或其它电气设备、电气线路的过载保护电器。这里不得不提一下马达保护

  • 智能时尚:人工智能在时尚&服装行业的应用综述 | 580+参考文献

    论文:https://arxiv.org/abs/2111.00905标题:SmartFashion:AReviewofAIApplicationsintheFashion&ApparelIndustry摘要 时装业正处在一场前所未有的变革的边缘。机器学习、计算机视觉和人工智能(AI)在时尚应用中的应用为这个行业带来了许多新的机遇。本文对这一问题进行了全面的调查,将580多篇相关文章分为22项定义明确的时尚相关任务。这种结构化的基于任务的多标签时尚研究文章分类为研究人员提供了明确的研究方向,方便了他们访问相关研究,同时提高了研究的可视性。对于每项任务,都会提供一个时间图表,以分析历年的进度。此外,我们还提供了86个公共fashion数据集的列表,以及建议的应用程序列表和每个应用程序的附加信息。关键词:SmartFashion,FashionApplications,NeuralNetworks,RecommenderSystems,FashionTry-on1、简介人工智能为时装业的零售商和顾客带来了许多好处[1]。这就是为什么每年都有越来越多的研究致力于人工智能在时尚行业中的

  • 【Flutter 专题】125 图解自传 ACE_ICON.ttf 图标库

    和尚在学习过程中通常会需要大量的小图标,而多数的Icon都是经过设计同学优化过的,而如何采用类似系统Icons方式,此时可以通过自传类似字体库的ttf图标库的方式来完成;ACE_ICON和尚推荐两个网站可以用来生成图标库;https://www.fluttericon.com/https://www.iconfont.cn/1.生成ACE_ICON.ttf图标库和尚以https://www.fluttericon.com/为例来生成图标库;在这个图标库中有很多成套的图标,在这里可以选中需要的图标,也可以将本地生成的.svg文件拖拽进库中;其中设置完图标库名称后,通过工具选择下载不同的文件,包括ttf图标库、config配置文件以及mapping映射文件; 2.集成ttf图标库 将ACE_ICON.ttf库文件添加到project资源文件中;在pubspec.yaml文件中声明ACE_ICON.tt文件库;声明方式与字体库等一致,注意family与font名称一致;在此可以声明引入多个资源库文件;之后pubget即可;fonts: -family:DancingScript fonts:

  • 如何在胶囊网络中加速胶囊卷积(cs AI)

    如何提高胶囊网络路由程序的效率已经进行了大量研究。然而,胶囊卷积的效率在很大程度上被忽视了。胶囊卷积,它使用胶囊,而不是神经元作为基本的计算单元,使它不符合目前的深度学习框架的优化解决方案。因此,在这些机制下胶囊的卷积通常非常缓慢。我们观察到,胶囊卷积可以被认为是"多个小矩阵的倍增"加上基于张量的组合的操作。基于这一观察,我们用CUDAAPIs开发了两个加速方案,并在自定义胶囊网络上测试它们。结果表明,我们的解决方案实现了4倍加速。原文题目:HowtoAccelerateCapsuleConvolutionsinCapsuleNetworks原文:HowtoimprovetheefficiencyofroutingproceduresinCapsNetshasbeenstudiedalot.However,theefficiencyofcapsuleconvolutionshaslargelybeenneglected.Capsuleconvolution,whichusescapsulesratherthanneuronsasthebasiccomputation

  • 自动更新程序源码下载(C#.Net)

    由于微软提供的更新程序使用不方便,所以又写了此程序。此程序是本人一年前所写的一段程序,当时在开发一个CS版本报价系统,当时由于开发过程仓促,代码可能有点不是太规范此程序编译后只有一下AutoUpdate.exe文件与一个配置文件UpdateList.xml,主要通过本地程序与服务端程序文件的版本号来升级与更新本地程序文件。UpdateList.xml文件内容如下:<?xmlversion="1.0"encoding="gb2312"?><AutoUpdater><description>ApplicationautoUpdate</description><Updater><Url>http://10.0.5.98/SoftUpdate/</Url><LastUpdateTime>2005-09-05</LastUpdateTime></Updater><ApplicationapplicationId="Ite

  • Socket学习总结系列(二) -- CocoaAsyncSocket

    这是系列的第二篇这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的先大概的总结一下在上篇的文章中说的些内容:1、整理了一下做IM我们有那些途径,以及我们怎样选择最适合自己的2、在做IM的时候协议你又该怎样选择,以及这些协议之间一些的对比等等3、接下来梳理了一下Socket的我们该怎样理解,它的心跳,pingpong,重连机制等等4、利用demo整理出来了原生Socket的简单的连接以及接收/发送消息。这篇我们梳理那些1、对CocoaAsyncSocke这个三方的理解以及一些自己的看法 2、分析CocoaAsyncSocket的集成,源码的一些解析3、利用CocoaAsyncSocket实现Socket的连接,接收/发送消息,以及总结一下这整个过程认识一下CocoaAsyncSocke这里我们先认识一下CocoaAsyncSocke:CocoaAsyncSocke是谷歌的开发者,基于BSD-Socket写的一个IM框架,它给Mac和iOS提供了易于使用的、强大的异步套接字库,向上封装出简单易用OC接口。省去了我们面向Socket以及数据流Strea

  • Google 翻译中国站点疑似关闭;28岁程序员网购生发丸吃成肝损伤;硅谷巨头集体向 Tiktok 开火 | EA周报

    EA周报2022年9月30日每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事、掌握IT核心技术。周报看点1、字节跳动宣布员工福利升级:新增10天“家庭关爱假”2、Google翻译中国站点疑似关闭3、罗永浩卸任锤子科技集团法定代表人,仍为股东及实控人4、28岁程序员网购生发丸吃成肝损伤5、贾跃亭率合伙人夺回FF控制权,再获1亿美元融资6、硅谷巨头集体向Tiktok开火7、欧盟投入850万构建开放搜索引擎,希望取代Google热点大事件字节跳动宣布员工福利升级:新增10天“家庭关爱假”字节跳动官微宣布,员工假期及健康福利计划升级,新增“家庭关爱假”,每年10个工作日;“全薪病假”天数从半年4个工作日提升至全年12个工作日,丧假也分别比之前的假日多出两个工作日。网传小米汽车首台工程车下线,汽车工厂年底竣工根据雪球网博主粮厂研究员Will透露的消息,小米汽车首台工程车已经在9月28日下线,年底前汽车工厂竣工。据悉,小米汽车总部基地在2021年11月落户北京经开区,汽车工厂分两期建设,一期项目已于2022年4月开工,二期项目计划将在2024年3月开工,工厂累计年产量将达30万辆。在20

  • mui框架从0到1【webapp开发教程】

    文章目录APP开发3.25会议记录miu框架介绍头部/搜索框:身体>轮播图轮播图设置数据自动跳转:九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器目前样式:APP开发随着需求的不断更新,与对技术的不断探索,计划在20天之内与团队协作开发一款移动端的app3.25会议记录开发采用HBuilderX(普通版即可) 框架:mui 数据库:sqlite 协同开发:gitee 框架学习时间:3天下次会议时间:3.27(周日)晚 统一进度,分配任务,着手开发备用方案: 待定接口:flask/djangomiu框架介绍最接近原生APP体验的高性能前端框架。 MUI是一套前端框架,由DCLOUD公司研发而成,提供大量H5和js语言组成的组件,大大提高了开发效率,可以用于开发web端应用、webAPP、混合开发等应用。利用MUI框架,用户在使用APP时可以得到接近原生APP的操作体验。头部/搜索框:创建快捷键:头部mhe 创建搜索框:搜索框min<divclass="mui-input-rowmui-pull-leftmui-search"> <i

  • 工业企业数字化转型,甲乙双方的困境

       前两天参加了一个特钢钢管生产企业内部智能制造项目的专家评审会,这个项目从立项到现在已经有三四个月的时间了,推进比较缓慢。总体情况向大家作个汇报。    有5家企业参加项目评审,2家外国公司,在工业领域比较知名;3家国内的企业,其中2家偏IT类企业,1家为高校校办企业。针对每个企业参加项目评审的具体情况不详细介绍,总体来说没有一家企业能够完全符合甲方的“要求”。项目评审会后,甲方内部对推进项目进行了充分讨论,最终的结论是这个项目暂时不具备招标条件,内部再梳理项目细节、指标及框架等内容。    有的企业到现场调研了5、6次,有的企业到现场调研了2、3次。从甲乙双方的切身感受来讲,这个项目推进仍然比较困难。在饭局上,厂领导说:在最困难的时候接手这个厂子,我都没有感觉到困难,但是现在这个项目,心里确实没底。    造成这样的困境是多方面的,在不扩大讨论范围,就这个项目评审会谈谈我的感受。    一.从甲方来讲,总体需求包括两个方面:工业互联

  • Vue3学习与实战 &#183; 组件通信

    在使用Vue3构建中大型web应用时,组件通信肯定是不可避免的。本文就具体介绍一下使用Vue3的props、\(emit、expose/ref、\)attrs、v-model、provide/inject、Vuex、mitt等方式进行组件通信。 1.props 用props传数据给子组件有两种方法,如下 混合写法:OptionAPI+setup //Parent.vue传参 <child:msg1="msg1":msg2="msg2"></child> <script> importchildfrom"./child.vue" import{ref,reactive}from"vue" exportdefault{ data(){ return{ msg1:"这是传级子组件的信息1" } }, setup(){ //创建一个响应式数据 //写法一适用于基础类型ref还有其他用处,下面章节有介绍 constmsg2=ref("这是传级子组件的信息2") //写法二适用于复杂类型,如数组、对象 constmsg2=reactive(["这是

  • Blazor Server 和 WebAssembly 应用程序入门指南

    翻译自WaqasAnwar2021年3月12日的文章《ABeginner’sGuideToBlazorServerandWebAssemblyApplications》[1] 如果您一直紧跟.NET世界的最新发展趋势,那么现在您一定听说过Blazor。目前在.NET社区中有很多关于Blazor的宣传,这种宣传最常见的原因是它引入了一些大多数.NET开发人员十几年来一直梦寐以求的东西,即:既可以在服务端又可以在浏览器中运行C#的能力。Blazor允许我们使用HTML、CSS和C#(而不是JavaScript)来构建交互式Web应用程序。在本教程中,我将介绍Blazor的基本概念,并概述可用于Blazor的不同的托管模型。我还将介绍每种托管模型的优缺点,以便您可以为下一个Blazor项目托管模型做出最佳的决定。 Blazor是什么? Blazor是一个免费、开源的单页应用程序(SPA)开发框架,使开发人员能够在服务端和客户端上使用C#构建交互式Web应用程序。Blazor不需要在客户端上安装任何插件来在浏览器中执行C#/.NET代码。它使用WebAssembly执行.NET代码,W

  • iOS中按钮点击事件处理方式

    写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能。按钮事件的实现方式有多种,其中 较为常用的是目标-动作对模式。但这种方式使得view与controller之间的耦合程度较高,不推荐使用; 另一种方式是代理方式,按钮的事件在view中绑定,controller作为view的代理实现代理方法。 目标-动作对实现方式 具体来说,假设我们有一个包含一个Button的veiw,view将Button放在头文件中,以便外部访问。然后controller将view作为自己的view,在viewcontroller中实现按钮的点击事件。文字描述起来好像不够直观,直接上代码 1、MyView.h 包含一个可被外部访问的按钮的view @interfaceMyView:UIView @property(strong,nonatomic)UIButton*myBtn; @end 复制 2、MyView.m #import"MyView.h" @implementationMyView //view的初始化方法 -(id)initWithFrame:(CGRect)fra

  • 模拟实现 Promise(小白版)

    模拟实现Promise(小白版) 本篇来讲讲如何模拟实现一个Promise的基本功能,网上这类文章已经很多,本篇笔墨会比较多,因为想用自己的理解,用白话文来讲讲 Promise的基本规范,参考了这篇:【翻译】Promises/A+规范 但说实话,太多的专业术语,以及基本按照标准规范格式翻译而来,有些内容,如果不是对规范的阅读方式比较熟悉的话,那是很难理解这句话的内容的 我就是属于没直接阅读过官方规范的,所以即使在看中文译版时,有些表达仍旧需要花费很多时间去理解,基于此,才想要写这篇 Promise基本介绍 Promise是一种异步编程方案,通过then方法来注册回调函数,通过构造函数参数来控制异步状态 Promise的状态变化有两种,成功或失败,状态一旦变更结束,就不会再改变,后续所有注册的回调都能接收此状态,同时异步执行结果会通过参数传递给回调函数 使用示例 varp=newPromise((resolve,reject)=>{ //dosomethingasyncjob //resolve(data);//任务结束,触发状态变化,通知成功回调的处理,并传递结果数据 //rej

  • 华强北手表DT100Pro怎么样?

    好久没写过手表类的了,年初的时候持"巨资"拿了块HQB手表(u98plus),然后写了下面这篇文章(没看过的感兴趣的可以看看),从手表不菲的售价到实际到手后的体验,个人感觉一般,尤其是u98p匹配的APP做的真的很一般,而且手表抬手亮屏反应也比较慢。 niceyoo:华强北S6智能手表?值得买吗?M16|HW12|HW16|HW22|U98422 那篇文章也算是劝退了不少小伙伴,至少一段时间内我是不想碰了,不过断断续续的总是有人问我一些手表型号怎么样,比如最近问的比较多的就是DT100pro,据说这个系列在某音上卖的比较火,问我怎么样,难道现在HQB手表又可以了?不过问完价格后反正我是不太相信。  结合最近拿到手的体验,具体描述如下: 1、关于外观 非常惭愧。。受限于贫穷,一直没舍得买正版,所以没法做明显的对比,左图为朋友发我的正版,右侧为我手里的DT100pro,大家先勉强看个大概。 下面是去年买到的u98plus(左)对比图,那一款送人了,也没法直接对比了,大家看个大概吧。 **外观感受:**DT100pro的屏占比感觉更饱满一点,左u98plus-1.7寸,右td

  • 上传功能源代码

    1packagecom.baidu.ueditor.um; 2 3importjava.io.BufferedInputStream; 4importjava.io.BufferedOutputStream; 5importjava.io.BufferedReader; 6importjava.io.File; 7importjava.io.FileOutputStream; 8importjava.io.InputStreamReader; 9importjava.io.OutputStream; 10importjava.text.SimpleDateFormat; 11importjava.util.Arrays; 12importjava.util.Date; 13importjava.util.HashMap; 14importjava.util.Iterator; 15importjava.util.Random; 16 17importjavax.servlet.http.HttpServletRequest; 18 19importorg.apache.commons.

  • C++ 环境配置小记 (CUDA, OPENCV, 并行计算)

    本机编译opencv 版本4.1官方教程:https://docs.opencv.org/4.1.0/d7/d9f/tutorial_linux_install.html 关于CMakeList 进入项目目录 mkdirbuild cdbuild cmake各种参数 make-j7 sudomakeinstall 复制 手动通过cmake安装的文件卸载方法 找到当初cmake的build文件夹,然后 sudomakeuninstall cd.. sudorm-rbuild 复制 关于opencv版本问题 有一些函数opencv4.xx不支持了 可以考虑使用opencv3.6.4,make时候也不会出错,其他3.2.xx会出错 AsampleofCMakeList.txt,包括CUDA和opencv配置 PROJECT(segment) CMAKE_MINIMUM_REQUIRED(VERSION2.8) FIND_PACKAGE(CUDAREQUIRED) FIND_PACKAGE(OpenCVREQUIRED) LINK_LIBRARIES("-L/usr/local/cud

  • BZOJ3884 上帝与集合的正确用法

    Description 给定\(p\),求\(2^{2^{2^{2^{2^{\cdots}}}}}\modp\)。\(p\leq10^7\)。 Solution 令\(f(p)=2^{2^{2^{2^{2^{\cdots}}}}}\modp\)。由于\(b>\phi(p)\)时\(a^b\equiva^{(b\,mod\,\phi(p))+\phi(p)}(mod\;p)\)。所以\(f(p)=2^{f(\phi(p))+\phi(p)}\modp\)。 由于易证\(\phi(\phi(p))\leq\fracp2\),所以时间为\(O(\logp)\)。 Code #include<cstdio> typedeflonglongLL; constintN=10000050; intphi[N],pr[N/10],cnt; intpow_mod(inta,intb,intp){ intans=1; for(;b;b>>=1,a=(LL)a*a%p) if(b&1)ans=(LL)ans*a%p; returnans; } intcalc(int

  • YOLOv3训练自己的数据

    1.下载官网的YOLOv3,打开终端输入:gitclonehttps://github.com/pjreddie/darknet下载完成之后,输入:cddarknet,然后再输入:make,make完成之后,下载预先训练的weights文件,通过在终端里输入:wgethttps://pjreddie.com/media/files/yolov3.weights,然后就可以运行检测器了,在终端里输入:./darknetdetectcfg/yolov3.cfgyolov3.weightsdata/doa.jpg(这条命令得在darknet目录下运行),会得到这样的结果: 2.开始训练自己的数据(1)在darknet目录下新建一个voc命名的文件夹,voc文件夹里新建VOCdevkit文件夹,在VOCdevkit文件夹里新建VOC2018文件夹,在VOC2018文件夹下新建Annotations,ImageSets,JPEGImages,SegmentationClass,SegmentationObject这五个文件夹,在ImageSets文件夹下新建Main文件夹。其中Annotatio

  • 使用Yeoman generator来规范工程的初始化

    前言 随着开发团队不断发展壮大,在人员增加的同时也带来了协作成本的增加;业务项目越来越多,类型也各不相同。常见的类型有基础组件、业务组件、基于React的业务项目、基于Vue的业务项目等等。如果想要对每个项目进行一些规范上的约束比如Git提交规范、Javascript规范简直难于登天。所有的这些,只是因为还欠缺一个好用的工程化工具,在项目创建的初期自动的将这些目录结构和文件生成、并且集成工程常见的规范来进行约束。 本文分为两部分,首先会谈谈目前团队的痛点以及基于yeomangenerator的设计思路;然后会详细介绍如何实现定制的generator,过程中遇到的问题和解决办法。 痛点一:工程创建不智能 代码目录文件手工拷贝 不同场景的工程对目录结构的要求不尽相同 痛点二:规范约束难以统一集成 难以在新的工程项目中集成新的规范,需要手动加hook 缺少增量机制对旧项目集成 基于Yeomangenerator的设计思路 我们需要给每个工程类型的项目创建一个generator。按照目前前端技术栈的发展情况来看,一个团队一般会有3~5个generator。把这些generator

  • KMP算法板子

    intnext[100]; voidgetnext() { stringa//(查找的串) next[0]=-1; intj=0,k=-1; for(j=0;j<a.size();j++) { if(k==-1||a[j]==a[k]) { next[++j]=++k; } else { k=next[k]; } } }复制 得到所用的next数组 intkmp(strings)//s被查找的串 { intj=0; for(inti=0;i<s.size();i++) {      j=0; while(i<s.size()&&j!=-1&&j<a.size()) { if(a[i]==a[j]) j++; else j=next[j]; if(j==a.size()) returni-a.size(); } } }复制  

  • LF.63.All SubsetsII

    GivenasetofcharactersrepresentedbyaString,returnalistcontainingallsubsetsofthecharacters.AssumptionsTherecouldbeduplicatecharactersintheoriginalset.​ExamplesSet="abc",allthesubsetsare["","a","ab","abc","ac","b","bc","c"]Set="abb",allthesubsetsare["","a","ab","abb","b","bb"]Set="",allthesubsetsare[""]Set=null,allthesubsetsare[]复制 1publicList<String>subSets(Stringset){ 2//Writeyoursolutionhere. 3List<String>res=newArrayList<>(); 4if(set==null){ 5returnres; 6} 7char[]chars=set.to

相关推荐

推荐阅读