- 学习资料:
- 综合运用
- 基础学习
- 23种常见设计模式
- 从功能角度对设计模式进行分类
- 相似的设计模式
- 装饰模式:动态的为一个类添加新的职责
- 代理模式:控制其他对象的访问
- 策略模式:
- 工厂模式
- 原型模式
- 模板方法模式:定义一个算法骨架,将一部分子步骤在子类中实现
- 外观模式:为一组接口创建一个统一的管理类
- 建造者模式:使用同样的创建过程创建不同的对象
- 观察者模式:建立一对多的依赖关系,多个观察对象监听一个主题对象
- 允许一个工厂创建一系列对象">抽象工厂模式:允许一个工厂创建一系列对象
- 状态模式:用于简化对象状态转换时的逻辑判断
- 适配器模式:将原本的接口转化为用户需要的接口
- 备忘录模式:在该对象之外保存这个对象,并可以进行恢复
- 组合模式:用于表示部分整体的树形层次结构,使客户端对单个对象和组合对象的操作一致
- 单例模式:这个类型同时只能存在一个实例
- 桥接模式:如果系统可以多角度分类,每一种分类都有可能变化。
- 命令模式:将请求封装为对象,
- 责任链模式
- 中介者模式
- 享元模式
- 解释器模式
- 访问者模式
学习资料:
图说设计模式 — Graphic Design Patterns
学设计模式前,请务必先看完这个!_哔哩哔哩_bilibili
没看这本,目前使用《大话设计模式》。以单元剧的形式用一个个小情景剧讲解常用的设计模式和设计原则。
五分钟学设计模式.11.代理模式_哔哩哔哩_bilibili
讲解得很好
什么是设计模式呢?在我看来,设计模式就是为了减少代码中的重复和冗余的部分,降低维护成本,增加代码的可读性。大大增加了代码的开发效率。
综合运用
策略模式+工厂模式+模板模式 混合使用
这个视频讲得很好,不仅语言逻辑通顺,而且将三种设计模式巧妙的混合使用,可以多看几遍。
使用策略类代替代码逻辑,工厂模式通过实现一个map<String,Handle>
去掉if-else语句,模板模式让添加策略方法变得灵活。
反射+配置文件+简单工厂模式 改进抽象工厂模式
使用反射可以去掉简单工厂模式中的if/switch语句,配合使用配置文件可以保证开闭原则,不必手动修改简单工厂对象。
基础学习
UML类图
关于耦合度,不同的依赖关系的耦合度不同,但这不是绝对的,和应用的场景又很大关系。耦合度其实和模块化有关系,模块化越高,耦合度越低。
此处,推荐研究以下unix哲学(unix哲学是固定搭配,叫做unix方法论也没错)
继承 继承类,子类拥有父类的一切
实现 实现接口,实现类必须实现接口的所有方法
关联 一个类是另一个类的成员
依赖 作为方法的局部对象、方法参数使用,耦合度最弱的关联方式
组合 部分和整体生命周期相同,即在初始化整体时同时实例化部分
聚合 弱的拥有关系,A可以含有B
面向对象设计原则
单一职责原则:一个类,应该只有一个引起它变化的原因。
意义:如果一个类有多个职责,当其中一个职责发生变化时,会削弱或抑制这个类的其他职责。
方法:如果有大于一个的动机改变这个类,那么这个类就有大于一个的职责
开放-封闭原则:软件实体应该可以扩展,但是不能修改
意义:面对需求改变,可以保持系统稳定,并退出新的版本
方法:在变化发生时,将这个变化的位置设置为可扩展点
依赖倒转原则:高层模块不依赖底层模块,而是都依赖于抽象;里氏替换原则:子类可以将父类替换掉
意义:里氏替换原则必使子类替换父类而功能不受影响,父类才能被真正复用,子类可以添加任意功能。
迪米特法则:一个类只和直接的朋友通信
朋友:有耦合关系(依赖、关联、组合、聚合)的对象
直接朋友:成员变量、方法参数、方法返回值
意义:降低类之间的耦合度,低耦合的类被修改,不会影响有关系的类。有利于类的复用。
合成/聚合复用原则:优先使用合成和聚合,而不是类继承
使用继
23种常见设计模式
从功能角度对设计模式进行分类
扩展一个类的职责,可以使用:继承、组合模式、装饰器模式
控制对目标对象的访问:访问者模式,代理模式、状态模式、策略模式
控制对象的创建:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式
某种行为:责任链模式、模板方法模式、享元模式、命令模式、原型模式
减少冗余重复代码:桥接模式
通过中介者协调对象的交互:
相似的设计模式
不同的设计模式他们的写法可能类似,但是关注点不同。相同的设计模式,在不同的业务场景下也会有不同的写法。
状态模式 策略模式
简单工厂模式、工厂方法模式、抽象工厂模式
代理模式、装饰器模式、外观模式
责任链模式、装饰器模式、组合模式
建造者模式、
中介者模式、观察者模式
备忘录模式、原型模式
装饰模式:动态的为一个类添加新的职责
java的输入输出流大量使用了装饰器模式
意义:如果我们想要为一个类添加一个职责,如果直接在这个类中添加相关代码,很明显会破坏单一职责原则。这个时候我们需要装饰模式来对类的功能进行扩展。
原理:装饰模式扩展职责是通过创建**Decorator**
类代替**Component**
实施职责的同时添加更多的职责的方式实现的。并且由于Decorator
实现了Component
,其也可以对其他Decorator
的实现类进行扩展。形成一条扩展链。
变体:如果只有一个ConcreteComponent
,那么根据里氏替换原则,我们可以不需要Component
接口,直接让Decorator
继承和聚合ConcreteComponent
。同理可以使用ConcreteDecorator
替换Decorator
.
优点:将原本的类和修饰的功能分离,简化原来的类
代理模式:控制其他对象的访问
意义:控制被代理对象调用方法
应用场景:远程代理、虚拟代理、安全代理、智能指引
策略模式:
意义:当某种职责需要经常更改时,可以使用策略模式
原理:其实策略模式和代理模式原理和代码都很相似。只是使用场景不同。
工厂模式
简单工厂模式:
意义:工厂类中包含了逻辑判断,去除了客户端对具体实现类的依赖
工厂方法模式:
意义:相比简单工厂模式,更符合开放封闭原则。添加新的功能只需要添加新的工厂和具体实现类。
原型模式
意义:隐藏创建细节,还可以提高性能
在类中含有引用类型时,要选择深拷贝或浅拷贝
模板方法模式:定义一个算法骨架,将一部分子步骤在子类中实现
意义:将子类中的重复代码转移到超类,去除重复代码
外观模式:为一组接口创建一个统一的管理类
意义:将复杂的子系统的功能抽象出来,变为一个更加易用的类
建造者模式:使用同样的创建过程创建不同的对象
观察者模式:建立一对多的依赖关系,多个观察对象监听一个主题对象
抽象工厂模式:允许一个工厂创建一系列对象
在抽象工厂中添加新的产品
有违开闭原则,因为每次添加新产品都要在抽象工厂和具体工厂中修改代码
状态模式:用于简化对象状态转换时的逻辑判断
意义:当一个类的行为由状态决定时,使用状态模式可以将状态判断逻辑和行为封装到不同的状态类中。
适配器模式:将原本的接口转化为用户需要的接口
意义:解决想要复用类,但是接口不一致带来的问题。
备忘录模式:在该对象之外保存这个对象,并可以进行恢复
组合模式:用于表示部分整体的树形层次结构,使客户端对单个对象和组合对象的操作一致
意义:系统中出现像树一样的结构,且节点之间的操作是一致的,可以使用组合模式。能够让代码更简洁,更容易维护。
单例模式:这个类型同时只能存在一个实例
意义:将构造函数私有化,通过公开函数严格控制实例的创建。
由于单例模式全局只有一个对象,多个线程使用时会出现对线程问题。所以单例类一般都是无状态的。