GW Blog

Never stop thinking, never stop moving.

组合模式

《大话设计模式》第19章读书笔记,介绍组合模式

组合模式(Composite)将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 Component为组合中对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。 public abstract class Component { protected String name...

适配器模式

《大话设计模式》第17章读书笔记,介绍适配器模式

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也就是系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如在需要对早期代码复用一些功能等应用上很有实际价值。 ...

备忘录模式

《大话设计模式》第18章读书笔记,介绍备忘录模式

备忘录模式(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 发起人类,负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。 public class Originato...

状态模式

《大话设计模式》第16章读书笔记,介绍状态模式

以下面这段工作加班状态判断程序为例,我们可以看到对于当前状态的判断逻辑很复杂,并且如果我们想对17-22点这段时间的判断逻辑增加20点必须下班,那么需要直接进行改动,这就违反了开放-封闭原则。对于这类情况可以使用状态模式。 public class Work { private int hour; private boolean finish = false; public int...

工厂方法模式与抽象工厂模式

《大话设计模式》第8、15章读书笔记,介绍工厂方法模式与抽象工厂模式

工厂方法模式 之前讲到过简单工厂模式,它的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。但是针对之前举例的计算程序来说,现在要增加求M的N次方的运算,需要给运算工厂类的方法里加case分支条件,这就违反了开放-封闭原则。所以需要引入工厂方法。 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让...

观察者模式

《大话设计模式》第14章读书笔记,介绍观察者模式

观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。从下方的结构图可以看到,主要分为四个部分:抽象的被观察者、抽象的观察者、具体的被观察者、具体的观察者。 将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象之间的一致性。我们不希望为了维持...

建造者模式

《大话设计模式》第13章读书笔记,介绍建造者模式

建造者模式(Builder)将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。 什么时候需要使用建造者模式? 主要用于创建一些复杂的对象,这些对象内部构造间的建造顺序通常是稳定的,但对象内部的构造通常面临着复杂的变化。它的好处是使得建造代码与表示代码分离...

外观模式与依赖倒转原则和迪米特法则

《大话设计模式》第12章读书笔记,介绍外观模式,以及第5章外观模式和第11章迪米特法则

外观模式 外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 如图所示,客户端只需要通过外观类封装好的接口来调用子系统类的方法,而不用直接调用。这样可以封装好一些复杂的实现和调用。 子系统类如下 外观类与测试代码 public class Facade { private SubSystemOne one; ...

Java多线程——PriorityBlockingQueue DelayQueue源码解析

分析多线程无界优先级阻塞队列PriorityBlockingQueue和DelayQueue的实现原理

PriorityBlockingQueue和DelayQueue的底层实现其实很相似,都是基于堆排序的优先队列,堆中元素最小的最先出队。它们都只有一把非公平锁来控制入队和出队等public操作,并且都是无界阻塞队列,也就是说入队一定不会因为容量大小而阻塞,但是可能因为数组大小超过内存而OOM。后者的区别在于,出队获取元素前一定会经过设定的等待时间,而前者没有,所以可以用于定期过期的缓存等使用...

Java多线程——LinkedBlockingQueue ArrayBlockingQueue源码解析

分析多线程有界阻塞队列LinkedBlockingQueue和ArrayBlockingQueue的实现原理

LinkedBlockingQueue和ArrayBlockingQueue都是有界阻塞队列,符合先进先出的原则。当达到队列上限时,入队根据方法会被阻塞或者直接失败。LinkedBlockingQueue底层是链表,一定是非公平锁,阻塞的线程是随机竞争。ArrayBlockingQueue底层是在构造时建立的固定数组,锁根据构造时的参数可以是公平锁也可以是非公平锁,默认是非公平的。 Lin...