设计模式
2020-07-09 11:16:17 157 举报
AI智能生成
二十三种设计模式
作者其他创作
大纲/内容
是什么
对软件设计中反复出现的各种问题,所提出的解决方案
注意事项
在java中,抽象指的是接口或抽象类,细节就是具体的实现类
作用
重用性 (即:相同功能的代码,不用多次编写)
可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
七大原则
单一职责原则(Single Responsibility Principle)
一个类只负责一个功能的职责
开闭原则(Open Close Principle)
对扩展开放,对修改关闭
里氏代换原则(Liskov Substitution Principle)
任何父类可以出现的地方,子类一定可以代换
依赖倒转原则(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体实现
接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好
合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承
迪米特法则,又称最少知道原则(Demeter Principle)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立
UML
定义
一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果
分类
类图(class diagram)
描述类以及类与类之间的关系,通过该图可以快速了解系统
用例图(use case diagram)
用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系
时序图(sequencediagram)
描述执行特定任务时对象之间的交互关系以及执行顺序,通过该图可以了解对象能接收的消息也就是说对象能够向外界提供的服务
协作图(collaboration diagram)
状态图(statechart diagram)
活动图(activity diagram)
构件图(component diagram)
部署图(deploymentdiagram)
创建型
单例模式Singleton
定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点
8种写法
饿汉式(静态常量)
推荐使用
饿汉式(静态代码块)
推荐使用
懒汉式(线程不安全)
懒汉式(线程安全,同步方法)
懒汉式(线程安全,同步代码块)
双重检查
推荐使用
静态内部类
推荐使用
枚举
推荐使用
实例
spring bean默认为单例模式
工厂方式Factory
定义一个用于创建产品的接口,由子类决定生产什么产品。
抽象工厂模式AbstractFactory
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
建造者模式Builder
定义
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
jdk实例
StringBuilder
原型模式Prototype
定义
将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例
实现
浅拷贝
对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝
深拷贝
对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容
实例
spring prototye模式创建bean
结构型
适配器模式Adapter
定义
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
jdk实例
java.util.Arrays#asList()
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
组合模式Composite
定义
将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性
jdk实例
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
桥接模式Bridge
定义
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
实例
JDBC
外观模式Facade
为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问
享元模式Flyweight
定义
运用共享技术来有效地支持大量细粒度对象的复用
与单例区别
单例只会有一个实体, 但是享元类可以有多个实体, 各实体的内在状态也可以不同。
单例对象可以是可变的。 享元对象是不可变的。
应用
缓存
经典的应用场景
池技术:String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式
jdk示例
java.lang.Integer#valueOf(int)
装饰模式Decorator
定义
动态的给对象增加一些职责,即增加其额外的功能
jdk实例
java.io.BufferedInputStream(InputStream)
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStream)
代理模式Proxy
定义
为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性
代理方式
静态代理
动态代理
JDK代理、接口代理
Cglib代理
实例
Spring AOP底层实现
行为型
责任链模式Chain of Responsibility
每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
命令模式Command
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开
迭代器模式Iterator
提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示
中介者模式Mediator
定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解
备忘录模式Memento
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
实现
保存某个时间段的快照(List<History>),然后恢复
应用实例
1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。
模板模式TemplateMethod
定义
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
通俗理解
模板方法将算法分解为步骤, 并允许子类重写这些步骤, 而非重写实际的模板方法。
解释器模式Interpreter
定义
提供如何定义语言的文法,以及对语言句子的解释方法,即解释器
实例
通过解释器来实现四则运算,如计算a+b-c的值
观察者模式Observer
多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为
状态模式State
允许一个对象在其内部状态发生改变时改变其行为能力
策略模式Strategy
定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户
访问者模式Visitor
在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问
0 条评论
下一页