自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 收藏
  • 关注

原创 4.11 职责链模式

职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。这种类型的设计模式属于行为型模式。

2024-09-01 10:58:59 722

原创 4.10 策略模式

策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

2024-09-01 10:57:34 659

原创 4.9 状态模式

状态模式():它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

2024-09-01 10:56:20 694

原创 4.8 解释器模式

在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器是指给定一个语言(表达式)定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)应用场景应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树一些重复出现的问题可以用一种简单的语言来表达一个简单语法需要解释的场景这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等。

2024-09-01 10:55:11 603

原创 4.7 备忘录模式

备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作备忘录模式属于行为型模式。

2024-09-01 10:53:32 804

原创 4.6 中介者模式

中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互中介者模式属于行为型模式,使代码易于维护比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用。

2024-09-01 10:51:57 817

原创 4.5 观察者模式

气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要,便于。提供温度、气压和湿度的接口测量数据更新时,要能实时的通知给第三方。

2024-09-01 10:50:34 676

原创 4.4 迭代器模式

迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式如果我们的集合元素是用不同的方式实现的,有数组,还有 java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

2024-09-01 10:48:52 800

原创 4.3 访问者模式

访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离,解决 数据结构和操作耦合性问题访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决。

2024-09-01 10:46:52 551

原创 4.2 命令模式

命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。通俗易懂的理解:将军发布命令,士兵去执行。

2024-09-01 10:44:45 906

原创 4.1 模板方法模式

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤这种类型的设计模式属于行为型模式。

2024-09-01 10:43:33 876

原创 3.7 代理模式

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理代理对象的生成,是利用 JDK 的 API,动态的在内存中构建代理对象动态代理也叫做:JDK 代理、接口代理静态代理和 JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理。

2024-08-27 00:03:46 824

原创 3.6 享元模式

享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。

2024-08-27 00:03:33 629

原创 3.5 外观模式

外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

2024-08-27 00:03:13 807

原创 3.4 组合模式

组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。

2024-08-26 19:05:49 885

原创 3.3 装饰者模式

动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。

2024-08-26 19:03:15 841

原创 3.2 章桥接模式

基本介绍桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。是一种结构型设计模式Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

2024-08-26 19:00:48 699

原创 3.1 适配器设计模式

适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式类适配器模式、对象适配器模式、接口适配器模式基本介绍:Adapter 类,通过继承 src 类,实现 dst 类接口,完成 src->dst 的适配。基本思路和类的适配器模式相同,只是将 Adapter 类作修改,不是继承 src 类,而是持有 src 类的实例,以解决兼容性的问题。

2024-08-26 18:56:53 1026

原创 2.4 建造者模式

建造者模式() 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

2024-08-26 18:51:57 875

原创 2.3 原型模式

原型模式(Prototype 模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即对象形象的理解:孙大圣拔出猴毛, 变出其它孙大圣对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。

2024-08-26 18:49:42 810

原创 2.2 工厂模式

简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

2024-08-26 18:47:40 666

原创 2.1 单例模式【面试重点】

所谓类的单例设计模式,就是,并且该类只提供一个取得其对象实例的方法(静态方法)。比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。

2024-08-26 18:46:11 1279

原创 1.7 合成复用原则

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。针对接口编程,而不是针对实现编程。

2024-08-26 18:44:21 148

原创 1.6 迪米特法则

【代码】1.6 迪米特法则。

2024-08-26 18:43:47 296

原创 1.5 开闭原则

开闭原则(Open Closed Principle)是编程中的设计原则一个软件实体如类,模块和函数应该,对。用抽象构建框架,用实现扩展细节。当软件需要变化时,尽量实体的行为来实现变化,而不是已有的代码来实现变化。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。开闭原则:a.对扩展新功能是开放的b.对修改原有功能是关闭的比如:有一个刮胡刀,刮胡刀的作用就是刮胡子,现在想让刮胡刀具备吹风机能力。违反开闭原则的做法就是:把吹风功能加上了,可能不能刮胡子了。

2024-08-26 18:43:00 249

原创 1.4 里氏替换原则

里氏替换原则(Liskov Substitution Principle)在 1988 年,由麻省理工学院的以为姓里的女士提出的。如果对每个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。

2024-08-26 18:41:54 394

原创 1.3 依赖倒转原则

方式1:通过接口传递实现依赖方式2:通过构造方法依赖传递方式3:通过setter方法传递。

2024-08-26 18:40:25 167

原创 1.2 接口隔离原则

客户端不应该依赖它不需要的接口,即上如图所示类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D,如果接口 Interface1 对于类 A 和类 C 来说不是最小接口,那么类 B 和类 D 必须去实现他们不需要的方法。拆分为,类 A 和类 C 分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

2024-08-26 18:38:26 298

原创 1.1 单一职责原则

​ 对类来说的,。如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2。

2024-08-26 18:35:23 145

原创 Arthas 多隧道监控

内容来源:https://arthas.aliyun.com/doc/tunnel.html本文档结合:【Arthas 监控服务(直接在服务器运行)】一起看通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。比如,在流式计算里,Java 进程可以是在不同的机器启动的,想要使用 Arthas 去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个 Java 进程。

2023-10-25 14:31:19 253

原创 18.10 字节码指令集与解析举例 - 同步控制指令

组成java虚拟机支持两种同步结构:方法级的同步和方法内部一段指令序列的同步,这两种同步都是使用monitor来支持的。方法级的同步:是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池的方法表结构中的ACC_ SYNCHRONIZED 访问标志得知一个方法是否声明为同步方法;当调用方法时,调用指令将会检查方法的ACC_ SYNCHRONIZED访问标志是否设置。注意:一个方法无论是否添加synchronized,你都无法在字节码中看出区别,例如:是否是同步方法在字

2022-12-07 23:50:22 319 1

原创 18.9 字节码指令集与解析举例 - 异常处理指令

注意:如果使用throw new 异常名称()这种形式来抛出异常,那就会在代码中出现athrow指令,而在方法上面添加throw 异常名称这种形式来抛出异常,然后使用jclasslib的时候就会出现在方法下面多出现一个属性Exceptions,如下图所示:处理异常:在Java虚拟机中,处理异常(catch语句)不是由字节码指令来实现的(早期使用jsr、ret指令),而是采用异常表来完成的。异常表如果一个方法定义了一个try-catch或者try-finally的异常处理,就会创建一个异常表。 它包含了每

2022-12-07 23:49:17 153

原创 18.8 字节码指令集与解析举例 - 控制转义指令

程序流程离不开条件控制,为了支持条件跳转,虚拟机提供了大量字节码指令,大体上可以分为1)比较指令、2)条件跳转指令、3)比较条件跳转指令、4)多条件分支跳转指令、5)无条件跳转指令等。该内容在 【算术指令】 中介绍条件跳转指令通常和比较指令结合使用。在条件跳转指令执行前,一般可以先用比较指令进行栈顶元素的准备,然后进行条件跳转。条件跳转指令有:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull。这些指令都接收两个字节的操作数,用于计算跳转的位置(16位符号整数作

2022-12-07 23:48:17 174

原创 18.7 字节码指令集与解析举例 - 操作数栈管理指令

如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作操作数栈的指令。这类指令包括如下内容:将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2;复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup, dup2,dup_x1,dup2_x1,dup_x2, dup2_×2;将栈最顶端的两个Slot数值位置交换:swap。Java虚拟机没有提供交换两个64位数据类型(long、double)数值的指令。指令nop,是一个非常特殊的指令,它的字节码为0x00。和

2022-12-07 23:46:46 93

原创 18.6 字节码指令集与解析举例 - 方法调用与返回指令

​ 以下5条指令用于方法调用:注意:方法调用结束前,需要进行返回。方法返回指令是根据返回值的类型区分的。举例:通过ireturn指令,将当前函数操作数栈的顶层元素弹出,并将这个元素压入调用者函数的操作数栈中(因为调用者非常关心函数的返回值),所有在当前函数操作数栈中的其他元素都会被丢弃。如果当前返回的是synchronized方法,那么还会执行一个隐含的monitorexit指令,退出临界区。最后,会丢弃当前方法的整个帧,恢复调用者的帧,并将控制权转交给调用者。对应的代码:

2022-12-07 23:46:15 72

原创 18.5 字节码指令集与解析举例 - 对象的创建与访问指令

Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。有一系列指令专门用于对象操作,可进一步细分为创建指令、字段访问指令、数组操作指令、类型检查指令。虽然类实例和数组都是对象,但Java虚 拟机对类实例和数组的创建与操作使用了不同的字节码指令:创建类实例的指令:创建数组的指令:上述创建指令可以用于创建对象或者数组,由于对象和数组在Java中的广泛使用,这些指令的使用频率也非常高。对象创建后,就可以通过对象访问指令获取对象实例或数组实例中的字段或者数组元素。举例:以getst

2022-12-07 23:45:45 113

原创 18.4 字节码指令集与解析举例 - 类型转换指令

转换规则:Java虚拟机直接支持以下数值的宽化类型转换(widening numeric conversion, 小范围类型向大范围类型的安全转换)。也就是说,并不需要指令执行,包括:从int类型到1ong、float或者double类型。对应的指令为:i2l、 i2f、i2d从long类型到float、double类型。对应的指令为:l2f、l2d从float类型到double类型。对应的指令为:f2d简化为:int --> long --> float --> double精度损失问题尽管宽化类型转换

2022-12-07 23:44:34 71

原创 18.3 字节码指令集与解析举例 - 算数指令

作用:算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新压入操作数栈。分类:大体上算术指令可以分为两种:对整型数据进行运算的指令与对浮点类型数据进行运算的指令。byte、short、char 和boolean类型说明在每一大类中,都有针对Java虚拟机具体数据类型的专用算术指令。但没有直接支持byte、short、 char和boolean类型的算术指令,对于这些数据的运算,都使用int类型的指令来处理。此外,在处理boolean、byte、 short和char类型的数组时,也会转换为使

2022-12-07 23:43:30 143

原创 18.2 字节码指令集与解析举例 - 加载与存储指令

加载和存储指令用于将数据从栈帧的局部变量表和操作数栈之间来回传递。上面所列举的指令助记符中,有一部分是以尖括号结尾的(例如iload_)。这些指令助记符实际上代表了一组指令(例如iload_代表 了iload_0、iload_1、iload_2和iload_3这几个指令)。这几组指令都是某个带有一个操作数的通用指令(例如iload) 的特殊形式,对于这若干组特殊指令来说,它们表面上没有操作数,不需要进行取操作数的动作,但操作数都隐含在指令中。比如:iload_0:将 局部变量表中索引为0位置上的数据压入操

2022-12-07 23:39:01 109

原创 18.1 字节码指令集与解析举例 - 概述

如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当做最基本的执行模型来理解字节码与数据类型在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。例如,iload指令用于从局部变量表中加载 int 型的数据到操作数栈中,而 fload 指令加载的则是float类型的数据。对于大部分与数据类型相关的字节码指令**,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务**:也有一些指令的助记符中没有明确地指明操作类型的字母,如 arraylength 指

2022-12-07 23:36:52 236

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除