设计模式技术


一、熟悉设计模式吗?

答: 设计模式主要可以大致分为三大类,创建型模式、结构性模式与行为型模式三大类,我比较熟悉的创建型模式有:单例模式、原型模式、工厂模式。结构性模式有适配器模式、装饰器模式、代理模式。行为型设计模式有:模板方法模式、观察者模式。

设计模式描述
创建型模式单例模式、原型模式、工厂模式
结构型模式适配器模式、装饰器模式、代理模式
行为型模式模板方法模式、观察者模式
设计模式描述应用场景
单例模式概念:单例模式指的是,保证对象在内存中仅创建一次的设计模式,属于创建型设计模式中的一种。 主要有懒汉式与饿汉式两种创建方式。

懒汉式:在真正需要使用对象时才去创建该单例类对象;
   ① 私有化构造器 + 静态变量与volatile修饰 + 对外提供get方法 + 双重校验锁机制;
   ② 静态内部类创建:随着内部类的加载初始化而初始化;

饿汉式:在类加载时已经创建好该单例对象,等待被程序使用
   ① 私有化构造器 + 静态变量直接创建;
   ② 枚举类直接创建;
   ③ 静态代码块创建;
应用一: Spring框架中的Bean对象都是单例模式的,在Bean的生命周期依赖注入环节,为了解决循环依赖问题引入了三级缓存机制。当访问二级缓存EarlySingletonObjects时使用了双重校验锁机制实现了单例模式。

应用二: DBUtill类实现了单例模式,用于管理数据库连接,保证数据库连接自始至终都是一个。

应用三: log4j中的Logger对象,用了工厂模式+单例模式的组合。
工厂模式概念:工厂模式属于创建型设计模式的一种,通过工厂模式,不再通过new来创建对象,将创建对象的权力移交给工厂,隐藏对象创建逻辑,降低耦合关系

模式:【简单工厂模式】+【工厂方法模式】+ 【抽象工厂模式】 ,这三种模式越来越具备一般性。
应用一: Spring框架中的BeanFacatory就是一个经典的工厂模式,用于创建单例Bean对象。

应用二: Spring框架中的AOP面向切面编程,其通过Jdk或者Cglib动态代理实现,通常代理模式中都要搭配工厂模式使用。

应用三: log4j中的Logger对象,用了工厂模式+单例模式的组合。
代理模式概念: 代理模式又叫委托模式,是为某个对象提供一个代理对象,通过代理对象来代替对真实对象的访问,就可以在不修改原对象的前提下,提供额外的功能操作,扩展真实对象的功能。

代理模式: 【Jdk动态代理】 + 【Cglib动态代理】

① Jdk动态代理
原理: 代理类 + 公共接口 + 被代理类 + 处理类 (InvocationHandler)

当代理类调用接口中的公共方法时,实际调用的是InvocationHandler中重写的invoke()方法;

② Cglib动态代理
原理: ASM字节码框架 +子类继承代理类 + 被代理类 + 方法拦截器 (MethodInterceptor)

子类拦截父类的方法调用:当代理类调用父类中的方法时,实际调用的是方法拦截器中重写的 intercept()方法;
应用一: Spring框架中的AOP面向切面编程特性,底层原理就是动态代理技术。
(1) Spring默认使用Jdk动态代理来实现AOP代理;
(2) 当被代理类没有实现公共接口时,Spring会切换为使用Cglib代理,也可强制使用Cglib。

应用二: MyBatis框架中的Dao接口,也就是Mapper接口的底层原理就是动态代理,具体的:
MyBatis运行时会通过Jdk动态代理为Dao接口生成代理对象,代理对象proxy会拦截接口方法的调用,执行invoke()方法,具体就是执行MappedStatement所代表的sql,然后将sql的执行结果返回。

应用三: 在RPC远程过程调用框架的底层,消费方实现了一个 加@FeignClient 注解的远程调用接口,然后进行接口方法调用时,RPC底层会通过Jdk动态代理生成代理对象,在invoke方法内部进行Http请求的封装(序列化),以及向服务提供方发送Http请求,并处理Http响应结果,进行反序列化封装结果。
模板模式概念: 在模板模式中,抽象类已经写好了所有抽象方法执行的逻辑。它的子类可以按需重写抽象方法,但执行逻辑将按照抽象类中定义的执行。模板模式属于行为型模式,其特点就是行为由父类控制,逻辑由子类实现。应用一: AQS锁框架底层就是开放了一个被volatile修饰的state字段,并且通过模板模式提供了1个获取state字段状态的方法,以及4个获取与释放共享资源的方法。使用者通过在方法中重写对state字段的操作,可以实现独占锁/共享锁/可重入锁等。

应用二: Spring框架中,底层有很多以template结尾的类,比如封装了JDBC驱动的jdbctemplate、Feign底层用于创建request类的requestTemplate等,这些都属于模板模式的应用场景。
装饰者模式装饰者模式指在不改变现有对象结构的情况下,创建一个类包裹住原始类,动态地给该对象增加额外功能的模式,它比继承更灵活。

装饰模式主要包含4个角色: 抽象构件角色、具体构件角色、抽象装饰角色、具体装饰角色。
应用一: IO流是【装饰者模式】 + 【适配器模式】 的一个典型实践。InputStream是顶层的父类。FileInputStream是一个具体的被装饰者。而BufferedInputStream就是一个装饰者。
通过装饰者模式,可以让每次输入字节从磁盘中读取转变成从系统缓冲区读取,提高IO效率。

应用二: SpringSession框架的底层源码中,就用到了装饰者模式,它提供了一个SessionRepository类,其内部有一个session的过滤器,拦截到每个request请求,并将原request和response包装成了 SessionRepositoryRequestWrapper、SessionRepositoryResponseWrapper,包装后的request再次调用getSession()时,实际上是从redis中获取的。
观察者模式概念: 观察者模式,属于行为型模式的一种。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。应用一: Spring中的事件驱动模型,就是观察者模式的一个经典应用。

应用二: SpringBoot在启动时,会创建SpringApplication类对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是根据@Compoment注解标记好启动类以及初始化器和监听器。这里边就用到了观察者模式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值