简介 外观设计模式(FacadeDesignPattern)又被叫作门面模式,其描述是,通过为多个复杂的子系统提供统一的接口,使得子系统更容易被使用。 在现实生活中,常常存在办事复杂的情况,如办理房产证或者注册公司,有时需要跑几个部门才能办成,如果这些部门都在一个地方,或者是成立一个综合部门就方便很多。 对于上述例子,成立综合部分就相当于使用外观模式,为客户端提供统一的接口,从而降低的系统的耦合度、降低客户端的使用难度。 具体实现 创建一个抽象的图形接口,定义一个画图的行为: publicinterfaceShape{ voiddraw(); } 实现一个画圆形的具体类: publiccla...

  6ROR8UI4RPnR   2023年11月01日   57   0   0 设计模式

简介 组合模式就是组合多个对象形成树形结构以表示具有“部分整体”关系的层次结构。组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。 组合模式的关键是定义一个抽象构件类,它既可以代表叶子,也可以代表容器。客户端针对该抽象构件进行编程,无需知道它到底表示的是叶子还是容器,可以对其进行统一处理。 具体实现 对于组合模式的抽象构件角色,其代码示例如下: publicabstractclassComponent{ //增加成员 publicabstractvoidadd(Componentc); //删除成员 publicabstractvoidremove(Componentc)...

  6ROR8UI4RPnR   2023年11月01日   138   0   0 设计模式

简介 古代的活字印刷术就有点像享元模式,活字印刷就是将每个字模做出来,再印刷时再选取需要的字模到印刷板上,这样就构成了一页书的印刷板。这样的活字印刷大大提升了效率,减少了印刷板的空间。 在享元模式中,存储共享实例对象的地方称为享元池(FlyweightPool)。类比到上述的活字印刷术中,放置字模的地方就是享元池。 享元模式能做到共享的关键是区分了内部状态和外部状态,它们的简单释义是: 内部状态:存储在享元对象内部且不跟随环境变化而改变的状态,内部状态可以在对象之间共享 外部状态:通常由客户端保存,当需要时再传入享元对象中的状态,会跟随环境变化而改变,不可以在对象之间共享。 典型示例 一个...

  6ROR8UI4RPnR   2023年11月01日   89   0   0 设计模式

简介 迭代器设计模式(IteratorDesignPattern),也叫作游标设计模式(CursorDesignPattern)。 迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。 其定义是,提供一种方法来访问聚合对象,而不暴露这个对象的内部实现。 典型实现 首先,定义一个用于遍历聚合对象中所存储元素的抽象迭代器接口,其代码示例如下: publicinterfaceIterator{ //将游标指向第一个元素 publicvoidfirst(); //将游标指向下一个元素 publicvoidnext(); //判断是否存在下一个元素 publicboo...

  6ROR8UI4RPnR   2023年11月01日   131   0   0 设计模式

简介 观察者设计模式(ObserverDesignPattern)的别名有很多,如发布订阅(Publish/Subscribe)模式、模型视图(Model/View)模式、源监听(Source/Listener)模式或从属者(Dependents)模式。 无论是何种名称,其意图都是在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。 其主要解决了一个对象状态改变之后给其他对象通知的问题,而且考虑到易用性和低耦合,保证高度的协作性。 典型实现 在发布订阅模式当中,观察者就是订阅者,一般是需要定义一个抽象的观察者接口,其代码示例如下: publicinterf...

  6ROR8UI4RPnR   2023年11月01日   79   0   0 设计模式

简介 策略设计模式(StrategyDesignPattern)实际上起到一个解耦的作用,解耦了策略的定义、创建、使用三部分。 其概念是,定义一系列算法类,将每一个算法封装起来,并让它们可以互相替换。 从代码的层面上理解就是,将面向过程编程中的分支(如if-else或switch分支)代码,转换成面向对象的算法类,通过构建这些类的关系以实现不同分支的选择,实现运行时选择策略。 具体实现 在这里,使用一个加、减、乘的案例来展示策略模式的应用。 首先,对加、减、乘运算抽象出一个公共的方法,定义一个Strategy策略接口,其代码示例如下: publicinterfaceStrategy{ //加、...

  6ROR8UI4RPnR   2023年11月01日   84   0   0 设计模式

简介 命令设计模式(CommandDesignPattern)可以将请求发送者和接收者完全解耦。发送者和接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。 其定义是,将请求(命令)封装成一个对象,从而可用不同的请求对客户进行参数化(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。 典型实现 首先,定义一个抽象命令Command接口,通常仅声明一个执行命令的方法,其代码示例如下: publicinterfaceCommand{ //业务处理方法 voidexecute(); } 具体命令会实现各种类型...

  6ROR8UI4RPnR   2023年11月01日   91   0   0 设计模式

简介 状态模式(StateDesignPattern)的定义是,允许一个对象在内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 在状态模式中,通常有两种方式实现状态转换:统一由环境类来负责状态之间的转换;由具体状态类来负责状态之间的转换。 状态机 概念 状态模式一般用于实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法。 状态机会有3个组成部分:状态(State)、事件(Event)、动作(Action)。 拿“超级马里奥”游戏来举例,其中马里奥形态的转变就是一个状态机:初始状态是小马里奥,吃蘑菇这个事件会触发...

  6ROR8UI4RPnR   2023年11月01日   59   0   0 设计模式

简介 在模板方法设计模式(TemplateMethodDesignPattern)中比较重要的两个概念是基本方法和模板方法。 实现具体逻辑步骤的方法可以称之为基本方法,而把基本方法汇总起来形成一个总算法或总行为的方法称之为模板方法。 基本方法包括以下几种类型: 具体方法:在抽象类中声明,由具体子类实现 抽象方法:在抽象类中已经实现,在具体子类中可以继承或重写 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种 典型实现 在模板方法模式中,最重要的就是定义好一个抽象类,并在其中归纳总结出一个模板方法。一般而言,其代码结构示例如下: publicabstractcl...

  6ROR8UI4RPnR   2023年11月01日   109   0   0 设计模式

简介 备忘录设计模式(MementoDesignPattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。 其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。 典型实现 首先,定义一个备忘录Memento类存储状态,其代码示例如下: publicclassMemento{ privateStringstate; publicMemento(Originatoro){ this.state=o.getState(); } publicvoidsetState(StringState){ this...

  6ROR8UI4RPnR   2023年11月01日   95   0   0 设计模式

简介 职责链设计模式(ChainOfResponsibilityDesignPattern)的定义是,将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。 同时,将这些接收对象串成一条链,并沿着这条链传递这个对象,直至链上的某个接收对象能够处理这个请求为止。 职责链可以是一条直线、一个环或一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。 典型实现 首先,定义一个抽象处理者Handler类,其代码示例如下: publicabstractclassHandler{ //维持对下一个处理者的引用 protectedHandlersuccessor; publicvoid...

  6ROR8UI4RPnR   2023年11月01日   340   0   0 设计模式

简介 中介设计模式(MediatorDesignPattern)定义了一个单独的(中介)对象,来封装一组对象之间的交互。 如果对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象的其他所有对象,并进行适当处理。 而中介模式将这些对象之间的交互委派给中介对象交互,来避免对象之间直接交互,使其耦合松散。 典型实现 首先,定义一个抽象中介者接口,该接口用于与各对象之间进行通信。其代码示例如下: publicabstractclassMediator{ //维持所有同事对象的引用 protectedArrayList<Colleague>colleagues; //...

  6ROR8UI4RPnR   2023年11月01日   69   0   0 设计模式

简介 访问者设计模式(VisitorDesignPattern)的定义是,允许一个或多个操作应用到一组对象上,解耦操作和对象本身。 在使用访问者模式的时候,被访问的元素通常不是单独存在的,它们存储在一个集合中,这个集合称为“对象结构”,访问者通过遍历对象结构实现对其存储的元素进行逐个访问。 访问者模式使用了“双重分派”的调用机制,即元素对象定义一个操作方法支持注入访问者对象,在操作方法内调用访问者的访问方法,并将当前元素对象传入到访问方法中。 具体实现 在这里举一个工作当中的具体例子,在小公司的项目组当中,名义上区分了开发、测试等岗位,但实际上开发人员既要会开发,也有会测试,对于测试人员也是同...

  6ROR8UI4RPnR   2023年11月01日   67   0   0 设计模式

简介 在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则。 解释器设计模式(InterpreterDesignPattern)描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。 因此,解释器模式的定义是,为某个语言定义它的语法(文法)表示,并定义一个解释器用来处理这个语法。 典型实现 首先,需要定义一个抽象表达式类,其声明了抽象的解释操作,其代码示例如下: publicabstractclassAbstractExpression{ publicabstractvoidinterpret(C...

  6ROR8UI4RPnR   2023年11月01日   63   0   0 设计模式

命名规范 命名长度 命名的原则以准确达意为目标,其长度以遵循此原则为主,并且是越短越好。 对于公认、熟知的词,可以在项目内部统一成缩写 对于作用域较小的变量,可以使用较短的命名 对于作用域较大的变量,推荐使用可达意的较长的命名 命名上下文 命名时可以根据上下文来简化命名,如在User类中,就不需要对类中的成员变量添加user前缀,而是直接命名如name、password等名称。 在使用时,开发者也可以借助上下文明确变量的含义。 可读性 可读性指的是不使用特别生僻、难发音的英文单词来命名,同时也不要使用一些无意义、随意搭配的单词。 可搜索性 命名可搜索性指的是,使用IDE开发的时候,可以很方...

  6ROR8UI4RPnR   2023年11月01日   118   0   0 设计模式

解决办法 如果最近升级到了openssh8.8版,你会发现连接某些之前连接得好好的服务器突然无法连接: Unabletonegotiatewithx.x.x.xport2222:nomatchinghostkeytypefound.Theiroffer:ssh-rsa 解决办法是ssh命令指定算法: ssh-oHostKeyAlgorithms=+ssh-rsa-oPubkeyAcceptedKeyTypes=+ssh-rsauser@host-p2222 上面比较麻烦,可以修改ssh配置文件/.ssh/config,对于无法成功连接的host,增加以下配置项: HostKeyAlgori...

  6ROR8UI4RPnR   2023年11月01日   251   0   0 Linux

什么是NoSQL NoSQL是一种非关系型数据库管理系统,不需要固定的架构,可以避免JOIN连接,并且易于扩展。 NoSQL常用于具有庞大数据存储需求的分布式数据存储,通常是大数据和实时Web应用程序等场景。 对于海量数据,使用RDBMS处理是会导致系统响应时间变慢,一般的替代方案都是在负载增加时横向扩展到其他的服务器上,而NoSQL比关系型数据库更容易扩展。 NoSQL的功能和优点主要是以下几点: NoSQL数据库不遵循关系模型 NoSQL数据库是无模式或具有宽松模式的数据库 NoSQL提供简单的API作为存储和查询 NoSQL可以以分布式方式执行,易于扩展 关于MongoDB Mong...

  6ROR8UI4RPnR   2023年11月01日   86   0   0 NoSQL

组件结构 核心进程 在MongoDB中,核心进程主要包含了mongod、mongos和mongosh三个。 其中最主要的是mongod程序,其在不同的部署方案中(单机部署、副本集部署、分片集群部署),通过不同的配置,可以扮演多种不同的角色: 在单机部署中作为数据库服务器(提供所有读写功能) 在副本集部署中,通过配置,可以部署为Primary节点(负责写数据,也可以提供查询)、Secondary节点(从主节点复制数据,也可以提供查询)、以及Arbiter节点(不保存数据,主要用于参与选举投票) 在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信...

  6ROR8UI4RPnR   2023年11月01日   86   0   0 NoSQL

连接 标准URI连接语法 通常,可以设定标准的URI连接语法,作为连接配置: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb://:固定的格式,即指定当前的URI是标准的MongoDB连接语法 username:password@:可选项,如果设置,在连接数据库服务器之后,驱动会尝试登录这个数据库 host1:必须的,至少指定一个host,它指定了要连接服务器的地址。如果要连接副本及集,需要指定多个主机地址 portX...

  6ROR8UI4RPnR   2023年11月01日   203   0   0 NoSQL

索引简介 什么是索引 索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录。 索引支持MongoDB查询的高效执行。如果没有索引,MongoDB必须扫描集合中每一个文档,以选择与查询语句相匹配的文档。如果查询存在适当的索引,MongoDB就可以使用索引来限制它扫描的文档数。 筛选字段时使用索引提速有以下几个因素: 索引数据通过B树来存储,从而使得搜索的时间复杂度为\(O(\logn)\) 索引本身存储在高速缓存中,相比磁盘IO有大幅的性能提升(有的时候数据量非常大的时候,索引数据也会非常大,当大到超出内存容量的时候,会导致部分索引数据存储在磁盘上,这会导致磁盘IO的开销大幅增加,从而...

  6ROR8UI4RPnR   2023年11月01日   93   0   0 NoSQL
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~