一、创建型模式:都是用来帮助我们创建对象的!(关注对象的创建过程)
1.单例模式
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
2.工厂模式("Gof book"中把工厂方法与抽象工厂分为两种模式,所以创建型模式共为五种,这里只是为了方便整理,合在了工厂模式中)
-简单工厂模式
用来生产同一等级结构的任意产品。(对于增加新的产品,需要修改已有代码)
-工厂方法模式
用来生成同一等级结构中的固定产品。(支持增加任意产品)
-抽象工厂模式
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力,支持增加产品族)
3.建造者模式
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责),从而可以构造出复杂的对象。
4.原型模式
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
二、结构型模式:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。(关注对象和类的组织)
1.适配器模式
工作中的场景:经常用来做旧系统改造和升级;如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
学习中见过的场景:
java.io.InputStreamReader(InputStream); java.io.OutpuStreamWriter(OutputStream)
2.代理模式
核心作用:通过代理,控制对对象的访问!可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即:AOP的微观实现!)
AOP(Aspect Oriented Programming面向切面编程)的核心实现机制!
开发框架中应用场景:
structs2中拦截器的实现;数据库连接池关闭处理;Hibernate中延时加载的实现;mybatis中实现拦截器插件;AspectJ的实现;spring中AOP的实现(日志拦截,声明式事务处理);web service;RMI远程方法调用
3.桥接模式
实际开发中应用场景:
JDBC驱动程序;
AWT中的Peer架构;
银行日志管理:格式分类:操作日志、交易日志、异常日志
距离分类:本地记录日志、异地记录日志
人力资源系统中的奖金计算模块:奖金分类:个人奖金、团体奖金、激励奖金。
部门分类:人事部门、销售部门、研发部门。
OA系统中的消息处理:业务类型:普通消息、加急消息、特急消息。
发送消息方式:系统内消息、手机短信、邮件
4.装饰模式
职责:动态的为一个对象增加新的功能;装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
5.组合模式
使用场景:把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。
核心:抽象构件角色:定义了叶子和容器构件的共同点;叶子构件角色:无子节点;容器构件角色:有容器特征,可以包含子节点
6.外观模式
开发中常见的场景:
频率很高。哪里都会遇到。各种技术和框架中,都有外观模式的使用。如:
JDBC封装后的,commons提供的DBUtils类,Hibernate提供的工具类、Spring JDBC工具类等
7.享元模式
场景:内存属于稀缺资源,不要随便浪费,如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。
核心:享元模式以共享的方式高效地支持大量细粒度对象的重用;享元对象能做到共享的关键是区分了内部状态和外部状态。内部状态:可以共享,不会随环境变化而改变,外部状态:不可以共享,会随环境变化而改变
三、行为型模式:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责
1.责任链模式
定义:将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
场景:打牌时,轮流出牌;接力赛跑;大学中,奖学金审批;公司中,公文审批
2.迭代器模式
场景:提供一种可以遍历聚合对象的模式。又称为:游标cursor模式;聚合对象:存储数据;迭代器:遍历数据
3.中介者模式
核心:如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系极其复杂,这些对象称为“同事对象”;我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为一对多的星形结构。
4.命令模式
定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式、事务transaction模式
5.解释器模式
介绍:是一种不常用的设计模式;用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计;当我们需要开发一种新的语言时,可以考虑使用解释器模式;尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用Jruby,Groovy,java的js引擎来替代解释器的作用,弥补java语言的不足
6.策略模式
本质:分离算法,选择实现。
开发中常见的场景:JAVASE中GUI编程中,布局管理;Spring框架中,Resource接口,资源访问策略;
7.模板方法模式
核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类中定义好,具体实现延迟到子类中定义
8.状态模式
核心:用于解决系统中复杂对象的状态转移以及不同状态下行为的封装问题
9.观察者模式
核心:观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应
10.备忘录模式
核心:就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
11.访问者模式
核心:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。