- 博客(128)
- 资源 (2)
- 收藏
- 关注
原创 设计模式-访问者模式
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使得在不改变个元素的类的前提下定义作用于这些元素的新操作。
2024-10-04 23:32:29
563
1
原创 设计模式-解释器模式
解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。解释器模式(Interpreter):给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子。总结:了解即可,难度太大了。
2024-10-04 19:09:21
717
原创 设计模式-迭代器模式
他们提供了迭代器可以对外提供访问数据的接口,同时没有暴露内部的存储逻辑(根据上面的代码中,外部的端口是根据 while(i.hasNext) 来获取对象数据的,但是外部端口并不知道 获取到的每一个对象的结构类型是什么样的。所以就是说,没有暴露内部的逻辑储存)迭代器模式的作用就是将迭代元素的责任交给了迭代器,而不是聚合对象。我们甚至都不需要知道聚合对象内部结构就可以实现该聚合对象的迭代。迭代器模式(Interperter):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
2024-10-04 18:47:45
616
原创 设计模式-中介者模式
中介者模式(Mediator):用一个中介对象来封装一系列的对象的交互。它使得各对象不需要显示地相互调用,从而达到低耦合,还可以独立的改变对象之间的交互。
2024-10-04 18:26:39
772
原创 设计模式-命令模式
命令模式和职责链模式的一个相同点都是 将发送者和接收者完全的解耦。发送者和接收者没有直接的联系,发送者只需要知道如何发送命令即可,不需要知道命令是否成功。根据上面的这单代码中可以分析的出:命令发出者,发出一个具体的命令,而具体的命令中 关联了命令接受者,告诉接受者应该怎么做,就是让接受者去执行命令。命令模式(Command):将一个请求封装成一个对象,从而可用不同的请求对客户进行参数化,将请求排队或者记录请求日志,支持可撤销的操作。
2024-10-04 16:58:50
545
原创 设计模式-职责链模式
在职责链模式中,使得每一个对象都有可能来处理请求,而将这些多个对象 串一条链 来传递处理请求。只有最后最后一个对象可以完全处理这个请求。即最后一个对象也就是 链尾。从而也就实现了 请求的接受者和 发送者之间的解耦。职责链模式(Chain of Responsibility):通过给多个对象请求处理的机会,减少请求的发送者和接受者之间的耦合。将这些对象链接起来,在链中传递请求,知道有一个对象处理这个请求。职责链模式就是把多个处理者连起来形成一个链条,实现解耦。
2024-10-04 16:25:58
488
原创 设计模式-模版方法模式
模版方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些定义步骤。抽象类:负责实现一个算法的骨架,他是由一个final修饰的模版方法和若干个基本方法组成的。
2024-10-04 16:00:30
816
原创 设计模式-状态模式
----------------------------------- 状态模式和 策略模式的对比 ------------------------------------------------------符合 “开闭原则”。上面的Home类就是相当于一个 Context环境类,他依赖了对应的状态父类。很多情况下,我们对象的行为依赖他自身的一个或者多个属性的变化,这种属性的变化我们称为状态。状态模式的类图与策略模式一模一样,区别在于它们的意图。所以我们站在 状态的角度的时候,这就是 状态模式。
2024-10-04 15:25:59
697
原创 设计模式-策略模式
如图所示,我们上面提供了三种策略,策略A,策略B,策略C. 需要客户端来制定传入对应制定的策略方法,就是说,客户应该知道什么时间什么场景,执行什么样的策略。已经策略的之间的区别。而策略模式只是提供策略即可。策略模式中他将解决问题的方法定义一个算法群,一个具体的方法对应着一个算法,这里的一个算法我们称为一个策略。而且改模式的算法的变化独立于使用该算法的客户。策略模式(Strategy):定义一系列的算法,把他们一个个封装起来,并且使他们之间可以相互替换,从而让算法可以独立于使用他们的用户而变化。
2024-10-04 14:39:11
637
原创 设计模式-备忘录模式
它实现了对信息的封装,使得客户不需要关心状态保存的细节。保存就要消耗资源,所以备忘录模式的缺点就在于消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外这个状态,从而可以在以后将该对象恢复到原先保存的状态。就是实现的思路:就是可变化的类中关联中 备忘录对象,在数据为发生变化变化事,先吧数据保存在备忘录对象后。然后就可以用备忘录对象复原数据了。
2024-10-03 21:55:31
765
原创 设计模式-观察者模式
观察者模式也可以理解为 发布-订阅模式。Subject就是主题对象,也就是被观察者。负责添加了 观察者对象(Observer就是观察者对象),并且通知 notify 所有的观察者(订阅者对象)观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生变更时,所有依赖于他的对象都得到通知并自动更新。Credit就是观察者对象。当具体的Dredit对象的状态发生变化时。就需要通知所有的观察者来要钱。Dredit就是被观察者对象,而。
2024-10-03 21:03:00
730
1
原创 设计模式-代理模式
总结:发现这里的代理模式和装饰者模式有点相似。装饰者模式,是需要传入对应的被装饰者的对象,状态增量被装饰的功能。而这里的代理模式,我们外部是不知道 具体代理哪一个类的功能,对外部来说不可见的。在上面的代理模式示例代码中,Java程序员不对外开放,外界无法访问,已经被封装到了代理中。代理模式(Proxy):为其他对象提供一种代理以控制这个对象的访问呢。
2024-10-03 17:31:38
565
1
原创 设计模式-享元模式
主要目的就是对象的共享技术,理解为:共享池。也就是我们系统的池化思想,线程池,reids连接池,数据库连接池等等)。当系统的中同类型的对象比较的时候。统一管理,主要是减少内存的开销,让系统轻量级运行,所以叫做FlyWeight模式。从上述的代码中可以看到的是 Tool t1 和 Too1 t7是同一个对象。这样的话,保持了对应的对象可以重复利用,也就是共享利用。无需实例其他额外的对象。享元模式(FlyWeight):提供支持大量细粒度对象共享的有效方法(享元模式又称为连接池模式)
2024-10-03 17:06:40
1095
原创 设计模式-外观模式
这个外观模式或者是说门面模式,比较简单,随处可见。我们调用第三方的统一的接口,但是第三个提供的一个接口中 封装了一大片逻辑来实现我们的需求。外观模式(Facade):定义一个高层接口。提供一个统一的接口对外开放。客户端只需要和统一接口进行对接,减少了调用。
2024-10-03 16:06:35
843
1
原创 设计模式-组合模式
组合模式(Composite):将对象组合成树型结构以表示“整体-部分”的层次结构,是的用户对单个对象和组合对象的使用具有一致性。比如常见请求的DTO,VO这些东西。
2024-10-03 15:52:56
743
原创 设计模式-桥接模式
手机按照品牌分可以分为华为、小米、oppo、vivo等m个品牌,如果这些手机按照内存分又可以分为4G、6G、8G等n个内存。通过继承来实现的话,则需要 m*n个实现类(小米4g,小米6g,小米8g,华为4g,华为6g,华为8g,vivo4g,vivo6g,vivo8g,oppo4g,oppo6g,oppo8g)。减低了系统的复杂度。而Brand依赖了Memory部门,想当是这部分的依赖,就是一座桥。桥接模式将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量,也减少了代码量。
2024-10-03 15:24:24
1276
原创 设计模式-装饰器模式
比派生子类的灵活的原因就是:举例,原本的一个接口的一段公用代码,你这边为了满足你的需求,你直接对原有的代码上手修改,但是可能会不兼容其他第三方对这个接口的业务依赖。而你使用装饰者模式,动态通过装饰者类来装饰扩展,并不会影响原有的逻辑。原理就是:装饰者 重写了 被 装饰者 Source接口中的method方法 且 关联了 被装饰者。关联了被装饰者的对象的目的就是,就是希望调用 被装饰者的原有方法,在原有的基础上添加了 额外的基础。就可以 用 不同的装饰者子类可以 对于被装饰者 就有不同的 额外职责展示)。
2024-10-03 14:18:41
697
原创 设计模式-适配器模式
这段代码就是在适配器Adapter中关联了适配器适配器母接口Speker. 在适配器中的translate中实现了 speaker.speak()方法。首先:如何调用被适配的对象呢?可以通过 关联或者继承 适配器来实现。(1:这段代码是通过是通过继承来实现的,也达到了接口转换的目的)适配器模式:将一类的接口转换成满足用户需求的另一种接口。是的不相容的接口得以共同工作。2:通过对象关联的方法来实现适配器,就是上述的UML类图保持一致。
2024-10-02 21:44:47
650
原创 设计模式-单例模式
饿汉模式: 饿汉有饿又急,所以在类加载的过层中就 实例出了唯一对象 (当然,前提是清楚java 类加载过程)当一个类New出很多个实例且没有任何区别的时候,此时就没有必要New出多个实例了。单例模式:只保证一个类只有一个实例,并提供一个访问他的全局访问点。懒汉模式: 比较懒,只是在需要的时候,才会创建实例化。单例模式:有区分为懒汉模式和饿汉模式。
2024-10-02 18:48:21
634
1
原创 设计模式-抽象工厂模式
写代码的时候,我们先会以一下 工厂方法模式,工厂方法只有一个抽象父工厂,只有一个 父产品。所以先获取工厂实例后,通过工厂实例对象来决定 获取具体的产品。抽象工厂:提供一个接口,可以创建一系列相关或者相互依赖的对象,而无需制定他们具体的类。我们的现在的需求是:用瓶子来装可乐,可能是塑料瓶子,也可能是 玻璃瓶子。(个人建议先看完上文的简单工厂:抽象工厂是在简单工厂的基础上对比出来的。-- 可乐可乐(CocaCola)-- 玻璃瓶子(GlassBox)-- 金瓶子 (GoldBox)可乐瓶子(ColaBox)
2024-10-02 18:20:22
600
原创 设计模式-工厂模式
工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。由此发现:都是先创建工厂,然后在使用工厂实例获取产品。此时只有一个工厂,那么只能创建一类型的产品。当系统中加入新产品时,除了需要提供新的产品类之外,还要提供与其对应的具体工厂类。而工厂子类则负责生成具体的产品对象,即通过不同的工厂子类来创建不同的产品对象。
2024-10-02 16:57:45
977
原创 设计模式-生成器模式/建造者模式Builder
图文说明:距离相同的构建过程 得出不同的展示。此时就用两个类(文本生成器,XML生成器) 用来展示。说明:此刻存在Builder的必要性就是玩多态。实现的时候吧,还是通过指导器传入对应的构建器对象。来是现在不同的展示。尽管都是director.construct()相同的构造方法。但是构造出来不同的实现。构建起模式:将一个复杂类的表示与其构造分离,使得相同的构建过程能够得出不同的表示。(建造者其实和工厂模式差不多)
2024-10-02 16:19:41
720
1
原创 面试之CurrentHashMap的底层原理
首先回答HashMap的底层原理?HashMap是数组+链表组成。数字组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。要将key 存储到(put)HashMap中,key类型实现必须计算hashcode方法,默认这个方法是对象的地址。接着还必须要覆盖对应的equals方法。如果对于插入的操作的来说,那么对于添加操作,其时间复杂度依然为O(1),因为最新的Entry会插入链表头部。对于查找的来说话,就需要遍历 链表,然后key的equals方法去逐一对比查找。但是对应的key可以为空。
2023-07-26 10:45:01
1712
原创 JVM对象在堆内存中是否如何分配?
选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。因此当使用Serial,ParNew等带有压缩整理过程的收集器时,系统采用的分配算法是指针碰撞。当使用CMS这种基于清楚算法的收集器时,理论是就只能采用复杂的空闲列表。2:空闲列表: 内存不规整的情况下。1:指针碰撞:内存规整的情况下。
2023-07-22 10:36:01
628
原创 MySQL面试之InnoDB的行锁是怎么实现的?
2)select ... from lock in share mode语句:追加了共享锁,InnoDB会使用Next-Key Lock锁进行处理,如果扫描发现唯一索引,可以降级为RecordLock锁。3)select ... from for update语句:追加了排他锁,InnoDB会使用Next-Key Lock锁进行处理,如果扫描发现唯一索引,可以降级为RecordLock锁。Next-key Lock 锁: 记录锁和间隙锁组合,同时锁住数据,并且锁住数据前后范围。(RR隔离级别支持)
2023-07-16 20:46:52
983
原创 面试之可重复读是否可以解决幻读
产生幻读的原因是:行锁只能锁住行,但是新插入记录的这个动作,要更新的是记录之间的'间隙'。不过理论上 是会出现幻读的,简单的来说幻读指的是当用户读取某一范围的数据行时,另外一个事务又在该范围插入了新行,当用户再次读取该范围的数据时会发现 出现新的幻影行。当前读:读取的数据最新的数据,当前读和快照读不同,因为读取最新的数据而且保证事务的隔离性,所以当前读 是需要对数据进行加锁的。T5:Q3返回三行(0,0,1),(1,1,1),(6,6,1)T3:Q2返回两行(0,0,1),(1,1,1)
2023-07-16 19:10:39
953
原创 面试之MySQL的主从同步原理
注意: 主从节点binlog 文件+ pisiton 偏移量 来定位主从同步的位置,从节点会保存 已接收的偏移量,如果从节点发生down 机 重启,则会自动从 position的位置 发起同步。由于mysql默认的复制方式 都是异步的,主库把日志发送给 从库后 不关心 从库是否已经处理,这样会产生一个问题。这时候 把 从库身为 主库后,日志就丢失了。和全同步不同的是,半同步复制的逻辑是这样的,从库写入日成功后返回ACK 确认后 主库,主动收到至少一个从库 的确认就认为 写操作完成。
2023-07-16 14:41:58
651
原创 面试之MySQL中的mvcc
不同的事务session会看到自己特定版本的数据。当然快照是一种概念模型,不同的数据库可能用不同的方式来实现这种功能。能不能让读写之间也不冲突的方法,就是读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁。mvcc的目的就是多版本并发控制,在数据库的实现,,他实现的原理主要是通过 记录中的 3个隐式字段,Undo Log版本链,ReadView来实现的。首先需要知道什么是 MVCC?
2023-07-15 23:49:38
602
原创 面试之MySQL中的锁
行锁的是mysql锁中粒度最小的一种锁,因为锁的粒度很小,所以发生资源争抢的概率也很少,并发性能很大,但是 也会造成死锁,每次加锁和释放锁的开销也会很大。悲观锁:在对一条数据修改的时候,为了避免同时被其他人修改,在修改数据之前先锁定,在修改的方式控制。共享锁和排他锁是悲观锁的不同实现,都是属于悲观锁的范畴。Next-key-Lock锁: 记录锁 和间隙锁组合,同时锁住数据,并且锁住数据前后范围。排他锁(X):如果事务T对数据A加上排他锁后,则其他事务不能再对数据A加任何类型的封锁。
2023-07-15 22:03:37
591
原创 面试题之MySQL事物的特性
在关系性数据库管理系统配置,一个逻辑工作要成为事物,必须要满足4个特性,即所谓的ACID:原子性(Atomicity),一致性(Consistency)、隔离性(lsolation)和持久性(Durability)。指的是一个事务一旦提交,它对数据库中数据的改变就应该是持久性的。隔离性:指的的一个事务不能被其他事务干扰,即一个事务内部的操作及使用的数据对于其他的并发事务是隔离的。在非并发的状态下,事务间天然保证隔离性,因此只需要保证事务的原子性即可保证 一致性。
2023-07-15 16:45:59
783
原创 面试之双亲委派原理
详细解释:当一个类加载器收到加载任务时,会先交给自己的父加载器去完整,因此最终的加载的人任务都会交给最顶层的BootstrapClassLoader,只有当父加载器无法完成加载,才反馈进行递归回溯,此时子类加载的时候,就是通过调用对应的findClass(name)去加载,子类依次回溯加载。应用类加载器主要加载classpath下的class。1:loadclass:双亲委派机制,子类加载器委托父类加载器加载,父类加载器都加载失败时,子类加载器通过findclass自行加载。回答的过程中磨磨唧唧。
2023-07-15 12:30:40
847
原创 面试之SpringAOP的理解:
主要就是有JDK动态代理和CGLIB动态代理。对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGLIB动态代理生成一个被代理对象的子类来 作为 代理。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。AOP(面向切面编程)指的是那些业务本身无关,但是被业务模块所共同调用的业务逻辑或责任(日志管理,权限管理等)封装起来,便于减少系统的重复代码,降低系统见的耦合性,有利于未来系统的扩展性。
2023-07-11 10:22:39
395
原创 Redis常用面试题
通过VM功能可以实现冷热数据分离,是热数据人在内存中,冷数据保存在磁盘中,这样就 避免因为内存不足而造成访问数据下降的问题。缓存穿透:指的是 查询一个一定不存在的数据,由于缓存是不命中需要去数据库,导致这个不存在的数据每次请求都要到数据库查询,从而给数据库带来压力。缓存雪崩:指的缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据数据库压力过大甚至down机。通俗点:读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就缓存穿透。
2023-07-09 20:03:51
526
原创 面试必问之ThreadLocal的底层原理
最主要的目的: 首先为什么要有这个ThreadLocal 的通过变量副本来起到 线程隔离的作用引起线程不安全的原因是多个线程共享一个变量,如果变量不共享是不是就可以避免线程不安全问题呢?没错,threadLocal就是这么做的。每一个Thread类中都一个ThreadLocalMap类型的成员变量 threadLocals.。这个threadLocals就是用来存储当前线程变量和对应副本值的映射关系的。在中,多个线程访问同一个变量,可能读到另一个线程修改后的值,也可能不是修改后的值。所以。
2023-07-07 17:52:53
310
原创 面试必问之sychrionzed锁的底层原理
sychrionzed的底层原理:实例数据:存放类的属性数据信息,包括父类的属性信息;对齐填充:由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐;根据寻址优化算法synchrionzed用的锁就是存在对象头中。hotspot虚拟机的对象头主要包括两部分:MarkWord(标记字段),ClassPointer(类型指针)。其中classPointer时对象指向它类元数据的指针。虚拟机通过这个这个指针可以确定这个对象指向哪一个实列。
2023-07-06 22:57:01
174
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人