Java之设计模式

1、什么是设计模式

设计模式是⼀套被反复使⽤的、多数⼈知晓的、经过分类编⽬的、代码设计经验的总结。使⽤设计模式是为了重⽤代码、让代码更容易被他⼈理解、保证代码可靠性。

2、设计模式可以分成哪些类?

创建型:创建对象,不使用new直接实例化对象,灵活创建

结构型:通过类和接口间的继承和引用创建复杂结构的对象

行为型:类之间不同通信方式实现不同行为

3、工厂模式

客户端不需要关注创建逻辑,只需提供传⼊⼯⼚的参数  

Spring 中的 BeanFactory 使⽤简单⼯⼚模式,根据传⼊⼀个唯⼀的标识来获得 Bean 对象。

4、单例模式
  

饿汉式  类⼀加载就创建对象

优点:基于类加载机制避免了多线程的同步问题来保证线程安全,实例在类加载时就已经创建,因此在调用getInstance()方法时可以保证线程的安全      没有加锁,执⾏效率较⾼

缺点:不是懒加载,类加载时就初始化,浪费内存空间

懒汉式 线程不安全

优点:懒加载,使⽤的时候再创建对象

缺点:线程不安全   

懒汉式 线程安全

通过 synchronized 关键字加锁保证线程安全 
volatile 的两个重要特性:可⻅性、禁⽌指令重排序

静态内部类  

懒加载,线程安全,效率较⾼,实现简单

当 getInstance()⽅法被调⽤时, InnerClass 才在 Singleton 的运⾏时常量池⾥,把符号引⽤替换为直接引⽤

5、适配器模式


所谓适配器模式就是将⼀个类的接⼝,转换成客户期望的另⼀个接⼝。 

提高了类的复用;组合若干关联对象形成对外提供统一服务的接口;扩展性、灵活性好

目标类必须是抽象类

InputStreamReaderOutputStreamWriter 是典型使用了适配器模式的类。

InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"));

6、代理模式

 解耦合服务提供者和使⽤者,使⽤者通过代理间接的访问服务提供者  代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。
静态代理和动态代理的区别

动态代理更加灵活,在运行时动态生成字节码,并加载到JVM中  

Spring AOP通过 Proxy.newProxyInstance 方法生成代理对象,当代理对象的方法被调用时,实际上会调用 InvocationHandlerinvoke 方法。而我们在编写代码的时候,只需要关注切点和逻辑增强的实现

JDK动态代理   自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑

JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。

静态代理,接口一旦新增方法,目标对象和代理对象都需要进行修改,在编译时就将接口、实现类、代理类这些都变成一个个实际的class文件  每个目标类都单独创建一个代理类

7、观察者模式

 观察者模式主要⽤于处理对象间的⼀对多的关系,当⼀个对象状态发⽣变化时,所有该对象的关注者均能收到状态变化通知,以进⾏相应的处理。
 

8、装饰器模式

对现有的类对象进⾏包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能。
许多编程语⾔使⽤ final 最终关键字来限制对某个类的进⼀步扩展。 复⽤最终类已有⾏为的唯⼀⽅法是使⽤装饰模式: ⽤封装器对其进⾏封装。
比如I/O流中的BufferedInputStreamBufferedOutputStream

BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));

9、责任链模式

10、策略模式

定义了⼀系列封装了算法、⾏为的对象,他们可以相互替换。

Java.util.List 就是定义了⼀个增( add )、删( remove )、改( set )、查( indexOf )策略,⾄于实现这个策略的ArrayList 、 LinkedList 等类,只是在具体实现时采⽤了不同的算法。但因为它们策略⼀样,不考虑速度的情况下,使⽤时完全可以互相替换使⽤。
 

11、spring中使用了哪些设计模式

 工厂模式  通过 BeanFactory创建 bean 对象

Spring 中 bean 的默认作用域就是 singleton(单例)的。

代理设计模式  AOP

观察者模式  Spring 事件驱动模型就是观察者模式很经典的一个应用。

  • 定义一个事件: 实现一个继承自 ApplicationEvent,并且写相应的构造函数;
  • 定义一个事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
  • 使用事件发布者发布消息: 可以通过 ApplicationEventPublisherpublishEvent() 方法发布消息。

适配器模式   Spring AOP 的增强或通知(Advice)使用到了适配器模式,与之相关的接口是AdvisorAdapter   

每个类型的通知都有拦截器,Spring 预定义的通知要通过对应的适配器,适配成 MethodInterceptor 接口(方法拦截器)类型的对象 ,这个MethodBeforeAdviceAdapter 通过调用 getInterceptor 方法,将 MethodBeforeAdvice 适配成 MethodBeforeAdviceInterceptor )。

 

  



  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值