《Java设计模式》读书笔记
2022-04-24 20:41:48 33 举报
AI智能生成
登录查看完整内容
java GOF23
作者其他创作
大纲/内容
一个类只负责一个功能领域中的相应职责
降低类的复杂性,一个类只负责一个职责。
提高代码的可读性,逻辑清楚明了。
降低风险,只修改一个类,并不影响其他类的功能。
优点
代码量增多。(可将单一职责原则落在方法层面进行优化)
缺点
单一职责原则
指一个软件实体 如类、模块和函数应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。
提高系统的可维护性
提高代码的灵活性
开闭原则
是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口
提高代码的灵活性,可复用性。
接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
抽象层接口数量增加,抽象粒度较难把控。
接口隔离原则
提高代码的重用性,子类也有父类的属性和方法。
提高代码的可扩展性,子类有自己特有的方法。
当父类发生改变的时候,要考虑子类的修改。
里氏替换原则
指一个对象应该对其他对象保持最少的了解,又叫最少知道原则。
降低了类之间的耦合度,提高了模块的相对独立性。
由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
迪米特法则
高层模块不应该依赖底层模块,二者都应该依赖接口或抽象类。其核心就是面向接口编程。抽象不依赖于细节,细节依赖于抽象。
降低耦合度
依赖倒转原则
尽量使用合成/集合,不要用继承。
降低耦合度,提高代码的灵活性。
合成复用原则
七大原则
提高代码的可读性
提高程序的可维护性
提高代码的可复用性
提高代码的可靠性
核心主旨
写法简单
线程安全,在类的加载时候就完成实例化
如果该实例未被使用,则会造成资源浪费。
静态变量饿汉式
静态代码块饿汉式
实现方式
饿汉式
存在线程安全问题,实际应用开发中不能使用该方式。
不安全懒汉式
同步方法会消耗一定时间,实际应用开发中不推荐使用。
同步方法安全懒汉式
同步代码块不安全懒汉式
在首次调用时才会创建实例,不会造成资源浪费。
如果代码编写不正确会造成线程安全问题。
懒汉式
解决了懒加载和线程安全问题,同时也保证了效率。在实际开发中推荐使用。
双重检查
静态内部类需要JVM来的装载,而JVM装载类是线程安全的。
线程安全
在外部类被加载时,不会立即加载静态内部类,而是在调用获取实例方法时才会被JVM加载。
懒加载
效率高,实际开发推荐使用。
静态内部类
线程安全,还能防止反序列化重新创建对象。实际应用开发中推荐使用。
枚举
在整个应用中,该类的实例只存在一个。
单例模式
案例
UML 类图
静态工厂模式
方法工厂模式
工厂模式
适用场景
抽象工程模式
Product(产品角色):一个具体的产品对象。
Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个 复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是: 负责控制产品对象的生产过程。
主要角色
实现方式一
实现方式二
建造者模式
UML类图
数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。
对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类 的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
深拷贝为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象进行拷贝。
浅拷贝与深拷贝
原型模式
创建型模式
类适配器
组合适配器
适配器模式
桥接模式
装饰模式
组合模式
外观模式
亨元模式
事件的抽象合集。
抽象事件
被代理的对象,真实核心功能提供者。
真实角色
代理真实角色,拥有使用真实角色的功能权利,且可以做一些附属操作。
代理角色
和代理角色进行交互,而不直接与真实角色交互。
客户端
代理模式角色
一个真实角色需要有一个对应的代理,增加了程序复杂度,降低了开发效率。
静态代理
一个代理类,可以代理多个类。
JDK代理
一个代理类,可以代理多个类。提高代码的可复用性。
Cglib代理
动态代理
代理模式
结构型模式
使用场景
实现了最大化代码复用,父类中的模版方法或一些已经实现的步骤会被子类继承而直接使用。
既统一了的算法,也提供了很大的灵活性。父类的模版方确保了算法的结构保持不变,同时由子类提供部分功能的具体实现。
每一个不同的实现都需要一个子类实现,导致类的数量增加,系统整体变得庞大。
模版方法模式的注意事项和细节
模版方法模式
调用者角色。
Invoker
命令角色,需要调用的命令合集,可以是抽象类或者接口。
Command
接受者角色,知道如何实施和执行一个请求的相关动作。
Receiver
具体命令,将一个接受者对象与一个动作绑定,调用接受者相应操作,实现execute。
ConcreteCommand
角色分析
命令模式使得请求发送者和请求接受者消除彼此之间的耦合,让对象之间的调用更加灵活,实现解耦。
命令模式的注意事项和细节
可能导致某些系统有过多的具体命令类,增加了系统的复杂度,这点在使用的需要注意。
命令模式
迭代器模式基本介绍
由系统提供的,主要包含hasNext、remove、next方法。
Iterator
具体的迭代器类,负责数据遍历的具体实现。
ConcreteIterator
一个统一的聚合接口,将客户端和具体的聚合进行解耦。
Aggregate
具体的聚合,持有对象集合,并提供一个方法返回迭代器。
ConcreteAggregate
客户端,通过Iterator和Aggregate依赖子类。
Client
提供一个统一的方法遍历对象,客户不需要考虑聚合的类型,只需要使用统一的方法遍历即可。
隐藏了聚合的内部结构,客户端要遍历聚合时只能获取到一个迭代器,而不知道聚合的具体组成。
每个聚合对象都需要有一个对应的迭代器,增加了类的数量。
迭代器模式注意事项和细节
迭代器模式
观察者模式基本介绍
观察者模式
中介模式
备忘录模式
解释器模式
状态模式
策略模式
指责链模式
访问者模式基本介绍
是抽象访问者,为该对象中的ConcreteElement的每一个类声明一个Visit操作。
Visitor
是一个具体的访问值,实现Visitor中声明的每一个Visit操作,
ConcreteVisitor
数据结构,能枚举他的元素,可以提供一个供高层接口,用来允许访问者访问元素。
ObjectStructure
定义一个accept方法,用来接收访问者对象。
Element
具体元素,实现了accept方法。
ConcreteElement
访问者模式符合单一职责原则,让程序具有优秀的扩展性和较高的灵活性。
访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器。适用于数据结构相对稳定的系统。
具体元素对访问者公布细节,访问者关注了其他类的内部细节,违背了迪米特法则。导致对具体元素做变更时较为困难。
访问者模式
行为模式
Java设计模式
收藏
0 条评论
回复 删除
下一页