获取中...

-

Just a minute...

设计模式主要分三个类型:创建型、结构型和行为型。
创建型

  1. Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
  2. Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
  3. Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
  4. Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
  5. Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

行为型

  1. Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
  2. Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
  3. Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
  4. Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
  5. State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
  6. Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
  7. China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
  8. Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
  9. Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
  10. Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
  11. Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

结构型

  1. Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
  2. Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
  3. Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
  4. Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
  5. Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
  6. Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
  7. Flyweight,享元模式

    23种设计模式彩图

    动态代理和静态代理

    静态代理

    这种代理方式需要代理对象和目标对象实现一样的接口。在程序运行前,代理类的.class文件就已经存在了。
    优点:
  8. 可以在不修改目标对象的前提下扩展目标对象的功能。
    缺点:
  9. 冗余。程序员要手动为每一个目标类编写对应的代理类。 为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口
  10. 不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。静态代理的缺陷

动态代理

动态代理利用了JDK API,运用反射机制动态地在内存中构建代理对象,从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。
动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象
优点:

  1. 动态代理对象不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态代理。

    静态代理与动态代理的区别

  2. 静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
  3. 动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
  4. 静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
  5. 静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

    JDK中的动态代理和CGLIB

动态代理

  1. JDK中的动态代理: 通过反射类Proxy以及InvocationHandler回调接口实现的,
  2. 动态代理缺点: JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。

CGLIB

  1. CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
  2. CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
  3. CGLIB优点:它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。
  4. CGLIB缺点:对于final方法,无法进行代理

    实现动态代理的方案有下列几种

  • jdk 动态代理
  • cglib 动态代理
  • javassist 动态代理
  • ASM 字节码
  • javassist 字节码
相关文章
评论
分享
  • System-Security

    认证 认证(Authentication) 系统如何正确分辨出操作用户的真实身份? 通信信道上的认证:你和我建立通信连接之前,要先证明你是谁。在网络传输(Network)场景中的典型是基于 SSL/TLS 传输安全层的认证。 通信...

    System-Security
  • OAuth2授权码模式第三方应用先要到授权服务器上进行注册,然后从授权服务器中获取 ClientID 和 ClientSecret,以便能够顺利完成如下授权过程: 第三方应用将资源所有者(用户)导向授权服务器的授权页面,并向授权服务...

  • Java虚拟机

    JVM内存结构 VS Java内存模型 VS Java对象模型JVM内存结构Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,其中有些区域随着虚拟机...

    Java虚拟机
  • Computer-Network

    TCPTCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。 T...

    Computer-Network
  • Redis

    Redis介绍Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重...

    Redis
  • MySQL

    数据库基础知识数据库的定义数据库:物理操作文件系统或其他形式文件类型的集合;实例:MySQL 数据库由后台线程以及一个共享内存区组成;在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库,而是要通过数据库实例...

    MySQL
  • Java并发

    什么是线程安全,怎么保证线程安全?线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题 如何保证线程安全 JAVA 线程状态转换图示线程共包括以下5种状态。 新建状态(New) : 线程对象...

    Java并发
  • DataStructures-Algorithms

    动态规划动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 背包问题总结背包问题 (Knapsack problem x )...

    DataStructures-Algorithms
  • DataBaseDesign

    MySQL数据库开发规范 所有的数据库对象名称必须使用小写字母并用下划线分割(MySQL大小敏感,见名知意,最好不超过32字符) 所有的数据库对象名称禁止使用MySQL保留关键字(如 desc、range、match、delayed ...

    DataBaseDesign
  • MyBatis

    MyBatis介绍在介绍MyBatis之前先简单了解几个概念:ORM,JPA。 ORMORM(Object-Relationship-Mapping):是对象关系映射的意思,它是一种思想,是指将数据库中的每一行数据用对象的形式表现出来...

    MyBatis
Please check the parameter of comment in config.yml of hexo-theme-Annie!