思维导图:设计模式

2 篇文章 0 订阅
1 篇文章 0 订阅

思维导图:设计模式

在这里插入图片描述

附:文本结构

设计模式
	UML基础
		类图
			继承
				继承抽象类(实现)
					空心三角箭头的 虚线
				继承非抽象类(泛化)
					空心三角箭头的 实线
			组合和聚合
				组合(强依赖)
					实心 菱形箭头的实线
				聚合(弱依赖)
					空心 菱形箭头的实线
			关联和依赖
				关联(强关系)
					一条(可带尖箭头)实线
				依赖(临时关系)
					一条尖箭头的虚线
		时序图
			主要元素
				对象
					Actor
				生命线
					Lifeline
				控制焦点
					Focus of control
				消息
					Message
	创建型模式
		类型说明
			创建什么
			由谁创建
			什么时候创建
		工厂模式
			简单(静态方法)工厂模式
				动机
					不需要知道类的名字、不需要知道创建过程,就可以创建对象
				实现
					拥有三个角色
						具体工厂
						抽象产品
						具体产品
					Factory.createProduct(string):Product
						a
							return new ProductA()
						b
							return new ProductB()
					Product(abstract)
						use()
					ProductA
					ProductB
				使用
					只需简单传入参数即可创建需要的对象
				优点
					简化创建对象
				缺点
					增加新的产品类时,需要同时修改工厂类,产品多了,工厂类的逻辑也会复杂起来,扩展维护不方便
					由于使用的是静态方法,造成无法形成基于继承的等级结构
				适用场景
					产品类型不多,使用者只需要知道传入工厂类的参数即可得场景
				应用实例
					格式化日期
						DateFormat.getDateInstance(int style)
					获取不同加密算法的密钥生成器
						KeyGenerator keyGen=KeyGenerator.getInstance("DESede");
					创建密码器
						Cipher cp=Cipher.getInstance("DESede");
			工厂方法模式(重要)
				动机
					对简单工厂进一步抽象和推广
				实现
					拥有三个角色
						抽象工厂
						具体工厂
						具体产品
					Factory(abstract)
						create
					ConcreteFactoryA
						create
							return new A()
					ConcreteFactoryB
						create
							return new B()
				优点
					扩展简单了
				缺点
					修改麻烦了,每新增一个产品,需要同时新增一个对应的工厂实现类
				应用实例
					日志管理器
						LogFactory
						FileLogFactory
							createLog
								return new FileLog()
						DatabaseLogFactory
							createLog
								return new DatabaseLog()
			抽象工厂模式(重要)
				动机
					对工厂方法模式进一步抽象和推广
				实现
					拥有四个角色
						抽象工厂
						具体工厂
						抽象产品
						具体产品
				优点
					增加新的具体工厂和产品族很方便,无需修改已有系统,符合“开闭原则”
				缺点
					开闭原则的倾斜性,增加新的产品等级结构麻烦
						增加新的抽象产品,需要修改抽象工厂,以及增加实现对应的具体工厂
			原型模式
				动机
					通过clone,减少创建复杂对象的成本
				实现
					原型抽象类实现Cloneable接口的clone方法
					原型实现类继承原型抽象类
					将原型对象缓存到Cache对象的map中
					通过key就可以从Cache中快速获取到一份clone对象
				优点
					性能提高
				缺点
					需要引用不支持序列化的简介对象或者引用含有循环结构的时候,克隆方法写起来并不容易
					必须实现Cloneable接口
		建造者模式
			动机
				灵活创建复杂对象
			实现
				拥有
					指挥者
						具体干哪些儿活儿,来产出某个产品
					抽象建造者
						定义好各种活儿
					具体装修工
						会干各种活儿,并有自己的工作风格
					产品
				指定具体装修工以及产品,指挥者就安排该装修工做一系列活儿,来完成此产品
			适用场景
				相同的方法,不同的执行顺序,产生不同的结果
				多个部件或零件,都可以装配到一个对象中,但是产生不同的结果
				初始化特别复杂、参数多,而且很多参数都有默认值
		单例模式(重要)
			动机
				一个类始终只有一个实例
			实现
				构造方法必须私有
				饿汉模式
					通过静态成员得到实例
					一加载类就立马创建实例
				懒汉模式
					通过静态方法(加锁)得到实例
					第一次使用到的时候创建实例
					如果该实例不为空,此方法不重复创建实例
			优点
				始终共享一个实例
				节约资源,提高性能
				可扩展为,只允许控制指定个数的实例
			缺点
				扩展困难
				指责过重,工厂和产品的都由它自身扮演,违背“单一指责原则”
				如果长时间没有使用,可能会被GC回收,导致对象状态丢失
	结构型模式
		类型说明
			如何将类或者对象组织起来
			进一步分类
				类结构型
					通过继承关系和实现关系
				对象结构型
					尽量通过关联关系代替继承关系
		适配器模式(重要)
			动机
				将一个类的接口转换成客户希望的另一个接口
				使原本由于接口不兼容而不能一起工作的类可以一起工作
			实现
				Client和Adaptee不兼容的情况下,为了解耦,从而加入Adapter
				注入‘Adaptee适应者’到‘Adapter适配器’中
					Adapter implements Target
				经过Adapter.request适配处理步骤,Client就可以间接使用到Adaptee.specificRequest的服务
			优点
				增加了类的透明性和复用性,无需修改Adaptee原有代码,只需简单引入不同的Adapter即可兼容不同的Client的需求
				灵活性好,可通过配置文件等方式,轻松切换适配器
				扩展性好,可在不修改Adaptte类的代码基础上,增加新的适配器类
			缺点
				类适配器模式
					Java和C#不能支持多继承,因此不支持类适配器模式
				对象适配器模式
					更换Adaptee的方法过程较为复杂,需要先做一个Adaptee(适应者)的子类,将需要的方法替换,再将此字类当作真正的Adaptee注入到Adapter中
			模式应用
				JDBC抽象接口之所以能通用,是因为MySQL、Oracle等不同数据库,分别实现了对应的适配器类,如mysql-connection-java.jar
		外观模式(重要)
			动机
				提供统一的外观(或界面或接口),方便子系统调用
			主要解决
				简化客户端对复杂系统的访问
			实现
				提供一个外观类,持有多个目标对象
				外观类将目标对象的各种操作进行适当封装,从而对外提供更简易的接口访问方式
				客户端需要使用目标对象,只需通过外观类即可轻松访问
			优点
				减少系统相互依赖
					子系统相对独立
				提高灵活性
				提高安全性
					预防低水平人员带来的风险。
			缺点
				不符合开闭原则
				改东西很麻烦,继承重写都不合适
		组合模式(重要)
			动机
				使单个对象和组合对象的使用具有一致性
			何时使用
				你想表达部分、整体的层次结构时(树形结构)
				让用户能够统一地使用组合中的所有对象
			应用场景
				文件、文件夹管理
				树形菜单
				部分、整体场景
			关键代码
				树枝和叶子实现同一个接口
				树枝内部组合该接口,并且含有内部属性 List,里面放Component
				addNode
				removeNode
				getAll
			例子
				Node持有并管理下级的List<Node>
			优点
				高层模块调用简单
				节点自由增减
			缺点
				树枝和叶子都必须是实现类,而不是接口,违反了依赖倒置原则
		代理模式(重要)
			动机
				某些情况下,一个客户不想或者不能直接引用一个对象
				引入代理对象来间接的访问一个对象
			关键代码
				实现与代理类组合
			优点
				职责清晰
				高扩展性
				智能化
			缺点
				由于在客户端和真实主题之间增加了代理对象,因此处理速度可能会变慢
				有些代理模式的实现非常复杂
			适用场景
				远程代理
				虚拟代理
				保护代理
				Cache代理
				防火墙代理
				同步化代理
				智能引用代理
			区别于
				适配器模式
					适配器模式主要是改变所考虑对象的接口
					代理模式不能改变所代理类的接口
				装饰者模式
					装饰者是为了增强功能
					代理则是加以控制
		桥接模式
			动机
				将抽象部分和实现部分分离,使他们可以独立的变化
			主要解决的问题
				在有多种可能会变化的情况下,使用继承会造成类爆炸问题,扩展起来不灵活
			如何解决
				把多个角度分类分离出来,让他们独立变化,减少耦合
			实现
				Shape redCircle = new Circle(100,100, 10, new RedCircle());
					Shape和Color两个角度独立
					new OneShape(new OneShapeColor())
					聚合关联关系建立在抽象层
			模式扩展
				桥接模式和适配器模式通常用于设计的不同阶段,桥接模式用在系统的初步阶段,在初步设计完成之后,发现系统与现有类无法协同工作时,可以采用适配器模式
					但有时候初步设计也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况
		装饰者模式
			动机
				扩展一个类的功能
				动态增加、撤销一个类的功能
			实现
				“装饰者”的方法中,调用“被装饰者”的方法
				ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
				redCircle.draw();
					redCircle.draw()中实际上还使用了circle.draw()
			优点
				动态扩展
				替代继承的一种模式
				装饰者和被装饰者可独立发展
			缺点
				多层装饰比较复杂
		享元模式(不重要)
			动机
				共享对象,降低内存消耗
				有效支持大量细粒度的对象
			主要解决
				有大量对象时,把共同的部分抽象出来,如果有相同的业务请求,直接返回内存中已有的对象,避免重新创建
			关键代码
				HashMap存储这些对象
					保证不重复创建相同的对象
					类似单例模式的变体
			实现
				创建一个工厂,利用HashMap保存新类型的对象
				大量使用对象时,无需重复创建同类型的对象即可使用
			优点 
				减少对象创建,降低内存消耗,提高效率
			缺点
				需要分离出外部状态和内部状态,提高了代码复杂度
	行为型模式
		类型说明
			重点关注类和对象之间的相互作用
		命令模式(重要)
			别名
				动作模式
				事务模式
			动机
				不需要知道请求的接收者是谁
				也不知道被请求的操作是哪个
				只需在运行时指定具体的请求、接收者
				请求者只需要知道如何发送请求,而不必知道如何完成请求
			模式定义
				将一个请求封装成一个对象
				对请求排队、或者记录请求日志
				支持可撤销的操作
			模式分析
				将发出命令的责任和执行命令的责任分开
			代码实现
				定义Command接口
					execute
					undo
					redo
				具体命令类
					实现Command接口
					注入“接收者”对象
				调用者
					管理命令队列
						添加
						删除
					执行命令队列
			优点
				降低系统耦合度
				新的命令可以很容易加入
				可以很容易设计一个命令队列和宏命令(组合命令)
				可以方便地实现对请求的undo和redo
			缺点
				可能会导致系统有过多的具体命令类,因为每一条命令都需要设计一个具体命令类
		策略模式(重要)
			动机
				同一个任务,可通过不同的策略完成
				策略模式可以更好地切换策略
			代码实现
				环境类
					setStrategy
					algorithm()
						strategy.algorithm()
				抽象策略类
					algorithm()
				具体策略类
					algorithm()
			优点
				不修改原有系统代码,即可切换策略
				灵活增加新的算法或行为
				提供了管理相关算法族的办法
				提供了可以替换继承关系的办法
				可以避免使用多重条件转移语句
			缺点
				必须知道所有的策略类,并自行决定使用哪一个策略类
				会产生很多策略类,可以通过享元模式减少对象的数量
		状态模式
			和策略模式是亲兄弟
				策略模式是环境对象选择好策略去执行
				状态模式是状态变了,环境对象也跟着变
			代码实现
				环境类
					setState(State)
					getState()
				抽象状态类
					doAction(context)
				具体状态类
					doAction(context)
						context.setState(this)
					toString()
			优点
				封装了转换原则
				枚举可能的状态,在枚举状态之前需要确定状态种类
				将所有与某个状态相关的行为都放在同一个类中,并且可以方便的增加新的状态,只需要改变对象状态即可改变对象的行为
				允许状态转换逻辑与状态对象合为一体,而不是一个巨大的条件语句块
				可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
			缺点
				增加类和对象的数量
				实现较为复杂
				修改某个状态类的行为,需要修改对应类的源代码
				增加状态类,需要修改负责状态转换的源代码,否则无法切换到新增状态
			注意
				在行为受约束的时候使用状态模式
				而且状态尽量不超过5个
		观察者模式(重要)
			动机
				一个对象(观察目标)发生改变时将自动通知另一个对象(观察者),其他对象对此将相应作出反应
				根据需要可增加和删除观察者,使得系统易于扩展
			别名
				发布/订阅模式
					P/S模式
				模型/视图模式
					M/V模式
			代码实现
				被观察者
					Subject
						持有观察者列表
						attach()
							添加观察者
						notifyAll()
							foreach observerList
								update()
				观察者
					Observer
						Subject
						update()
				具体观察者
					ConcreteObserver
						ConcreteObserver(subject)
						subject.attach(this)
						update()
			优点
				观察者和被观察者是抽象耦合的
				建立一套触发机制
			缺点
				如果有很多观察者的话,将所有观察者都通知一遍会很耗时
			注意
				JAVA中已经有对观察者模式的支持类
				避免循环引用
				如果顺序执行,某一观察者发生错误会导致系统卡壳,一般采用异步方式
		迭代器模式(重要)
			动机
				为不同的聚合结构提供一个统一的接口
				提供一种顺序访问各个元素的方式,而无须暴露该对象的内部表示
			关键代码
				定义接口
					hashNext
					next
		责任链模式
			动机
				每个接收者包含下一个接收者的引用
				如果一个接收者无法处理请求,则传给下一个接收者处理
				如果最后一个也无法处理,则抛出异常
			应用
				在JAVA WEB中有很多应用
				拦截器
				过滤器
				异常处理
				编码处理
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值