设计模式(一)——几种常用设计模式简单剖析

编程入门 行业动态 更新时间:2024-10-06 06:48:21

设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式(一)——几种常用设计模式简单剖析"/>

设计模式(一)——几种常用设计模式简单剖析

目录

    • 1 认识设计模式
      • 1.1 设计模式简介
      • 1.2 设计原则
        • 1.2.1 单一职责原则
        • 1.2.2 开闭原则
        • 1.2.3 里氏代换原则
        • 1.2.4 依赖倒转原则
        • 1.2.5 接口隔离原则
        • 1.2.6 合成复用原则
        • 1.2.7 迪米特法则
      • 1.3 设计模式分类
    • 2 设计模式常用案例
      • 2.1 单例模式
      • 2.2 多种单例模式讲解
        • 2.2.1 单利模式-饿汉式
        • 2.2.2 懒汉式
      • 2.2.3 双重校验锁
    • 3 Spring设计模式剖析
      • 3.1 观察者模式
        • 3.1.1 Spring观察者模式
        • 3.1.2 ApplicationContext事件监听
        • 3.1.3 自定义监听事件
      • 3.2 代理模式
        • 3.2.1 JDK动态代理
        • 3.2.2 CGLib动态代理
        • 3.2.3 Spring AOP-动态代理
      • 3.3 工厂设计模式
        • 3.3.1 工厂模式案例
        • 3.3.2 BeanFactory工厂模式
      • 3.4 适配器模式
        • 3.4.1 Spring Aop适配器+代理模式案例
        • 3.4.2 Spring AOP适配器体系

1 认识设计模式

1.1 设计模式简介

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。
使用设计模式的目的是为了代码重用、让代码更容易被他人理解、保证代码可靠性

1.2 设计原则

优良的系统设计具备:
1.可扩展性(Extensibility)
2.灵活性(Flexibility)
3.组件化可插拔式(Pluggability)
常用设计原则:

1.2.1 单一职责原则

定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。
实例:以登录为例
原始设计方案:

使用单一职责重构:

1.2.2 开闭原则

定义:一个软件实体应当对扩展开放,对修改关闭。
实例:拿报表功能来说, BarChart 和PieChart 为不同的报表功能,此时在ChartDisplay 中使用报表功能,可以直接new对应的功能,但如果增加新的报表功能,在ChartDisplay 中使用,就需要改代码了,这就违背了开闭
原则。
原始设计方案:

基于开闭原则重构:

1.2.3 里氏代换原则

定义:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
实例:我们以给客户发消息为例,给VIP客户(VipCustomer)和普通客户(CommonCustomer)发消息,在SendMessage 中分别定义给普通会员和VIP发消息,如果以后有新的客户分类,不仅要添加客户分类,还要修改SendMessage ,违背了开闭原则。
原始设计方案:

基于里氏代换原则进行重构:

1.2.4 依赖倒转原则

定义:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
我们可以把之前的开闭原则案例修改一下,利用Spring框架进行修改,可读性更强,同时遵循了开闭原则、里氏代换原则和依赖倒转原则,如下图:

1.2.5 接口隔离原则

定义:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
实例:
原始设计方案:

基于接口隔离原则进行重构:

1.2.6 合成复用原则

定义:尽量使用对象组合,而不是继承来达到复用的目的。
实例:
原始设计方案:

基于合成复用原则进行重构:

1.2.7 迪米特法则

定义:一个软件实体应当尽可能少地与其他实体发生相互作用。
通过引 入一个合理的第三者来降低现有对象之间的耦合度。
实例:
原始设计方案:

基于迪米特法则进行重构:

1.3 设计模式分类

(1)创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”,单例、原型、工厂方法、抽象工厂、建造者5种设计模式属于创建型模式。
(2)结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,代理、适配器、桥接、装饰、外观、享元、组合7种设计模式属于结构型模式。
(3)行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器11种设计模式属于行为型模式。

2 设计模式常用案例

2.1 单例模式

单利模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。该类还提供了一种访问它唯一对象的方式,其他类可以直接访问该方法获取该对象实例,而不需要实例化该类的对象。
特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
2、避免对资源的多重占用(比如写文件操作)。

2.2 多种单例模式讲解

2.2.1 单利模式-饿汉式
public class SingleModel {//整个应用程序中只有1个实例private static SingleModel singleModel = new SingleModel();//只有自己能创建自己的实例private SingleModel() {}//对外提供获取该实例的方法public static SingleModel getInstance(){return singleModel;}public void message(){System.out.println("hello!");}
}
2.2.2 懒汉式

特点:
1、延迟加载创建,也就是用到对象的时候,才会创建
2、线程安全问题需要手动处理(不添加同步方法,线程不安全,添加了同步方法,效率低)
3、实现容易
案例:

public class SingleModel1 {//1.只能有一个实例private static SingleModel1 singleModel;//2.只能是自己创建自己的实例private SingleModel1() {}//3.对外提供一个方法用于获取唯一实例//synchronized  性能瓶颈,不加多线程时不安全public static synchronized SingleModel1 getSingleModel(){if(singleModel==null){singleModel =  new SingleModel1();}return singleModel;}
}

2.2.3 双重校验锁

public class SingleModel2 {//1.只能有一个实例private static SingleModel2 singleModel;//2.只能是自己创建自己的实例private SingleModel2() {}//3.对外提供一个方法用于获取唯一实例public static SingleModel2 getSingleModel(){//instance为空的时候才创建对象if(singleModel==null){

更多推荐

设计模式(一)——几种常用设计模式简单剖析

本文发布于:2024-02-07 02:26:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752542.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   几种   常用   简单

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!