目录
创建型模式
用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
单例模式
简单工厂模式、工厂方法模式、抽象工厂模式
原型模式
建造者模式
结构型模式
适配器模式
桥接模式
案例:手机类型与手机品牌
将抽象部分与实现部分分离,使他们都可以独立变化,基于类的最小设计原则
用桥接模式替代多层继承方案,可以减少子类的个数。
应用:JDBC的driver接口
应用场景:银行转账系统
装饰者模式
组合模式
案例:院校展示
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用有一定的一致性。
Component:对象声明接口
Composite:非叶子节点,用于存储子部件
Leaf:叶子节点。没有子节点
应用 HashMap
外观模式
案例:影院管理
1.也叫过程模式,对外提供一个一致的界面,通过这个高层接口,使得子系统更加容易使用
2.定义一个一致的接口,可以屏蔽内部子系统的细节,使得使用端只需要跟这个接口发生调用,无须关心系统的内部细节。
外观模式可以解决多个复杂接口带来的使用困难,起到简化用户操作的作用
应用:MyBaits
享元模式
案例:网站(新闻、博客、公众号)
经典应用场景就是字符串的池、数据库连接池
区分内部状态和外部状态,内部状态不随环境变化而变化,环境共享,外部状态不随内部状态的改变而改变
需要一个工厂类加以控制
应用:Integer.valueOf(),范围在-127-128之间使用享元模式,否则new一个对象
适用于内部状态和外部状态分开
代理模式
行为型模式
模板方法模式
案例:豆浆制作问题
在抽象类中公开定义了执行它的方法的模板,他的子类可以按需要重写方法实现,但调用要按抽象类中定义的方法运行。
钩子方法,默认不做任何事,子类可以视情况决定要不要覆盖它
应用:Spring IOC容器初始化
一般模板方法都加上final关键字,防止子类重写模板方法。
命令模式
案例:智能生活 遥控器 电灯、电视
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
Invoker:调用者角色
Command:命令角色,需要执行的所有命令都在这里,可以是接口或者抽象类
Receiver:接收者角色,知道如何实施和执行一个请求相关的操作
ConcreteCommand:将一个接收者与一个动作绑定,调用接收者相应操作,完成任务。
应用:JdbcTemplate
不足:可能导致某些系统有过多的具体命令类,增加了系统的复杂度。
访问者模式
案例:歌手打分
Visitor:抽象访问者,为该对象结构的ConcreteElement的每一个类声明一个Visit操作
ConcreteVistor:具体访问者,实现每个由Visitor声明的操作。
ObjectStruture:枚举它的元素,可以提供一个高层的接口允许访问者访问它的元素
Element:定义了一个Accept操作,可以接收一个访问者为参数。
ConcreteElement:实现Accept操作
如果一个系统由比较稳定的数据结构,又有经常变化的状态
迭代器模式(单一责任原则)
案例:院系遍历
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示(行为型模式)
优点:管理对象集合和遍历对象集合的责任分开 缺点:多个迭代器不好管理类
迭代器解决了不同集合的统一遍历问题
应用:ArrayList,LinkedList,HashTable
观察者模式
中介者模式
用一个中介对象来封装一系列的对象交互。中介使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互。
Mediator:定义了同时对象到中介者对象的接口
Colleague:抽象同事类
ConcreteMediator:具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从同事类接收消息,向具体同事对象发出命令
ConcreteColleague:具体的同事类,每个同事只知道自己的行为,而不了解其他同事类的行为,但是他们都依赖中介者对象
中介者如果出现问题,整个系统就会收到影响。
备忘录模式
案例:游戏战力恢复
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
使用户能够比较方便地回到某个历史的状态
Originator:对象,需要保存状态的对象
Memento:备忘录对象,负责保存好记录,即Originator内部状态
Caretaker:守护者对象,负责保存多个备忘录对象,使用集合管理,提高效率
解释器模式
案例:四则运算
给定一个语言,定义它的文法的一种表示,使用该解释器解释语言中的句子。可以将句子表示为一个抽象语法树,
Context:环境角色,包含解释器之外的一些全局信息
AbstractExpression:抽象表达式,这个方法为抽象语法树中所有的节点所共享
TerminalExpression:实现与文法找那个的终结符相关的解释操作
NonterminalExpression:为文法中的非终结符实现解释操作
应用:编译器、运算表达式计算、正则表达式、机器人
SpelExpressionParser
状态模式
案例:抽奖
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
State:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteState:具体状态,每一个子类实现一个与Context的一个状态相关的行为。
Context:维护一个ConcreteState子类的实例,这个实例定义当前的状态.
每个状态的行为都放到一个类中
策略模式
案例:银行收银打折
定义了算法家族,分别封装起来,让他们之间可以互相替换。
应用:Arrays的Comparator使用了策略模式
职责链模式
为请求创建一个接收者对象的链。将请求和处理分开,实现解耦
职责链模式中通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者。
Handler:定义了一个处理请示的接口
ConcreteHandler:具体处理者类,处理他所负责的请求,可访问它的后继者。