项目中使用到的设计模式:
    1、观察者模式:
    在ErrorListener和ConnectionListener中监听连接的详细情况.
    监听在连接成功和连接出错的时候进行消息的通知.告知客户端,客户端如何处理根据自身需求实现.

    2、建造者模式:
    创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

    options类中包含builder静态类.
    options类包含连接时候需要的所有参数,而且很多参数都是有默认值.
    使用建造者模式对于在初始化一个对象时,参数过多,或者很多参数具有默认值这中场景很符合.

    另外下面列举下建造者模式的适用场景:

    • 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
    • 多个部件都可以装配到一个对象中,但产生的运行结果不相同
    • 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
    • 初始化一个对象时,参数过多,或者很多参数具有默认值
    • Builder模式不适合创建差异性很大的产品类
      产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
    • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

    3、简单工厂模式:
    NatsConnection类使用ExecutorService.
    JDK自带的构造不同的线程池,最终获取到的都是ExecutorService接口实现类.
    ExecutorService es1 = Executors.newCachedThreadPool(); 用于大负载的产品服务器
    ExecutorService es2 = Executors.newFixedThreadPool(10); 用于轻负载的产品服务器
    ExecutorService es3 = Executors.newSingleThreadExecutor();
    从这里看到简单工厂模式的优势:
    (1)隐藏对象构造细节
    (2)分离对象使用方与对象构造方,使得代码职责更明确,使得整体代码结构更优雅

    4、外观模式:
    使用Facade模式可以为相互关联在一起的错综复杂的类整理出高层接口(API).
    其中的Facade角色可以让系统对外只有一个简单的接口(API)。而且,Facade角色还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正确的顺序调用各个类。