【JAVA】设计模式概述

目录

一、概念及分类

二、六大原则

三、详解关键点

1.创建型

 2.结构型

 3.行为型

 4.J2EE模式


一、概念及分类

概要:设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

种类:

1.创建型模式
提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
(工厂、抽象工厂、单例、建造者、原型)

2.结构型模式
关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
(适配器、桥接、过滤器、组合、装饰器、外观、享元、代理)

3.行为型模式
特别关注对象之间的通信。
(责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、空对象、策略、模板、访问者)

4.J2EE模式
特别关注表示层。这些模式是由 Sun Java Center 鉴定的。
(MVC、业务代表、组合实体、数据访问对象、前端控制器、拦截过滤器、服务定位器、传输对象)

合计33种设计模式。

 

二、六大原则

概要:设计模式是根据这些原则整理出来,但其中部分设计模式其实是会违背部分原则的。

1.开闭原则:对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,实现一个热拔插的效果。关键代码就是抽象化。

2.里氏替换原则:任何基类可以出现的地方,子类一定可以出现。

3.依赖倒转原则:针对接口编程,依赖于抽象而不依赖具体。

4.接口隔离原则:使用多个隔离的接口,比使用单个接口好。降低类之间的耦合度。

5.迪米特法则:一个实体应当尽量少地与其他实体类发生相互作用,使得系统功能模块相对独立。

6.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承。(使用继承需要新建子类,如果子类功能一样,那就没必要去增加代码量)

 

三、详解关键点

1.创建型

概要:实例的创建方式

工厂模式:让其子类自己决定实例化哪一个工厂类
使用场景:日志记录器、数据库访问、设计一个连接服务器的框架等等

抽象工厂模式:围绕一个超级工厂创建其他工厂

单例模式:全局唯一实例
使用场景:唯一序列号、计数器等等

*建造者模式:多个简单的对象一步一步构建成一个复杂的对象
使用场景:需要生成的对象具有复杂的内部结构、需要生成的对象内部属性本身相互依赖

原型模式:用于创建重复的对象
使用场景:资源优化、降低new产生一个对象的资源损耗、一个对象多个修改者。
总结:通过clone实现。

 2.结构型

概要:实例间的结构

适配器模式:两个不兼容的接口之间的桥梁
使用场景:有动机地修改一个正常运行的系统的接口
总结:增加一个适配器,内部集成两个不兼容接口到一个方法

桥接模式:抽象化与实现化解耦
使用场景:不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
总结:抽象类和接口一起使用,使产生的对象可以独立变化。

过滤器模式:使用不同的标准来过滤一组对象
总结:一个接口多个实现,每个实现都有自己的过滤规则。

组合模式:把一组相似的对象当作一个单一的对象
总结:内部实现方法,内部存放自身对象列表,提供方法操作内部对象列表

装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构
使用场景:动态增加功能,动态撤销。
总结:有点像代理,具体通过抽象类和接口一同实现,起增强作用。可以选择性使用。

外观模式:隐藏系统的复杂性,并向客户端提供了一个可以访问系统的接口
总结:多个类封装到一个类中,外部直接通过那个类调用对应的方法即可。

享元模式:用于减少创建对象的数量,以减少内存占用和提高性能
使用场景:系统有大量相似对象、需要缓冲池的场景
总结:就是对象的复用,创建一个工厂,将生成好的对象放在hashmap中,下次进来优先找hashmap

代理模式:为其他对象提供一种代理以控制对这个对象的访问
使用场景:远程代理、保护代理、防火墙代理、智能引用代理
总结:在代理类内部,去调用实现类,外部操作只传给代理

 3.行为型

概要:实例间的行为

*责任链模式:请求创建了一个接收者对象的链。接收者都包含对另一个接收者的引用。如果对象不能处理该请求,那么它会把相同的请求传给下一个接收者
使用场景:可动态指定一组对象处理请求
总结:自身内部封装一个自身对象,传递时指向下一个自身对象,有点像链表

命令模式:请求以命令的形式包裹在对象中,并传给调用对象
使用场景:认为是命令的地方都可以使用命令模式
总结:对象都实现一个接口,这个接口的作用是执行某项命令,下次调用这个对象时可以执行相应的命令

解释器模式:提供了评估语言的语法或表达式的方式
使用场景:SQL 解析、符号处理引擎等
总结:创建一个表达式接口,后面的类实现接口方法,然后以递归的方式处理自己的方法做判断,解释一个特定的上下文。然后参数从外面进来就会走到不同子类的方法,执行行为。就是解释你的参数作用。

迭代器模式:顺序访问集合对象的元素,不需要知道集合对象的底层表示
使用场景:处理聚合对象不关心它的内部表示
总结:创建两个接口,一个取值,另一个返回一个迭代器对象。然后取值的对象重写迭代器的hasnext和next方法。其实就是通过重写迭代器时,加上自己的业务。感觉就像是使用迭代器而已。

中介者模式:降低多个对象和类之间的通信复杂性,该类通常处理不同类之间的通信。
使用场景:对象之间存在比较复杂的引用关系
总结:对象实体类中都集成了中介者类的某个方法,需要进行相应操作时直接操作它的中介者方法即可。跟代理有些不一样。

备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象
使用场景:数据存档、数据库的事务管理
总结:创建一个类做数据对象,另起一个类实例化数据对象并增加一个状态,再另起一个类存储数据对象列表,当被实例化的对象被使用时,把包括状态的对象给放置到存储对象的列表中。这样子就在列表内备份了所有数据及其状态。

观察者模式:当一个对象被修改时,则会自动通知它的依赖对象
使用场景:对象间存在一对多关系
总结:观察者抽象类具有Subject对象及其方法,Subject类里面有观察者抽象类列表及其状态,创建实体观察子类继承了观察者类及其方法时处理了Subject对象,然后Subject类中set方法调用时会修改观察者抽象类,这样子每次Subject类在调用Set方法时,会触发观察者类的更新;观察者类在进行实例化时,会触发Subject类的某个方法。
总之,就是观察者抽象类,和Subject对象类,内部相互实例化,然后通过内部的某个方法相互调用,彼此都知道谁的值发生了改变。

状态模式:类的行为是基于它的状态改变的
使用场景:行为随状态改变而改变的场景;条件、分支语句的代替者
总结:创建一个接口,有一个行为方法,创建一个实体类实例化这个接口。然后创建两个接口实现类在行为方法上操作实体类。之后就可以通过实例化实现类去修改实体类的状态。
一个实现类就是一个状态行为,实现类的方法调用导致状态改变,然后导致类发生行为。

空对象模式:一个空对象取代 NULL 对象实例的检查
使用场景:空对象类将无缝地使用在需要检查空值的地方
总结:创建一个抽象类,具有字段name、判空的方法和取到name的方法,创建两个子类,一个返回真实的name及无空,另一个返回
"类不存在"及为空,另外再创建一个工厂类根据输入值返回不同类型的子类。当输入值匹配到真实无空的对象时,会返回真实对象,当未匹配到时,不会返回空,而是返回"类不存在"的子类对象。
其实他就是使用工厂模式返回不同值。

策略模式:一个类的行为或其算法可以在运行时更改
使用场景:可以动态地让一个对象在许多行为中选择一种行为
总结:创建一个接口,内部有一个方法,另外创建多个实现类,每个实现类都会对方法进行不同的实现,创建一个实体类,它的构造方法中放入了被创建的接口,这样子可以在实体类实例化时根据不同功能做实例化。
它是针对一个对象的不同解决方案,跟工厂模式性质不一样

模板模式:一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现。
使用场景:有多个子类共有的方法,且逻辑相同;重要的、复杂的方法,可以考虑作为模板方法。
总结:创建一个抽象类,内部有它的三个抽象方法,然后还有一个模板内部非抽象方法调用了它自己的抽象方法。创建两个实体类继承了抽象类,并重写了他的抽象方法。
实例化实体类时,可以直接调用父类的模板来调用它的实现方法。

*访问者模式:使用了一个访问者类,它改变了元素类的执行算法。主要将数据结构与数据操作分离。
使用场景:对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
总结:创建一个表示元素的接口,创建三个实现类实现该接口,再创建一个实现类实现并内部声明了该接口的数组。创建一个访问者接口及其实体访问者,访问者内部包含了元素实现类,通过元素的实现类来调用访问者实现类来完成对元素实现类对象的访问。
其实就是创建一个访问者接口,内部集成了元素实现类,而元素实现类那边同样处理了访问实现类,二者相互关系让访问者实现类拿到元素实现类给它的数据。

 4.J2EE模式

概要:JAVA鉴定的,特别关注表示层的设计模式

MVC模式:Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
总结:控制层用来处理数据,view用来展示数据,model层即数据模型

业务代表模式:对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。
总结:创建一个接口表示业务,创建两个实体服务类,创建一个服务做业务查询,创建一个服务集成了业务查询做业务代表,再创建了一个客户端集成了业务代表。
对客户端进行实例化时首先对业务代表进行实例化,客户端中调用业务代表的同名方法,后续通过改变业务代表的值来改变客户端显示的值。
有点像代理,不过操作的不是客户端本身,而是业务代表。

组合实体模式:用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解
总结:多个对象组合成一个实体对象,创建一个客户端类来操纵实体对象,其实就是操作一个组合的过程。

数据访问对象模式:把低级的数据访问 API 或操作从高级的业务服务中分离出来
总结:就是将dao层和service层拆开出来,dao层关注持久层。比较普遍的一种方式。

前端控制器模式:一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。
总结:类似网关

拦截过滤器模式:用于对应用程序的请求或响应做一些预处理/后处理。
总结:这里的具体实现是使用策略模式新建一个filter及其两个实现类,然后新建一个需要执行的操作target,创建一个过滤器链将filter和target绑定在一起,创建一个过滤管理器实例化过滤器链,同时将过滤器链绑定filter和target,创建一个客户端实例化过滤器管理器。后续通过实例化过滤器管理器和客户端,让客户端去配置管理器完成调用。
感觉就是一层一层的去实例化对象,将请求给传递进去,执行到了过滤器链的excute方法就完成了拦截过滤。用户不需要关注底层过滤器,只需要配置好过滤器管理器即可。

服务定位器模式:首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象
总结:将得到的结果放到cache中,后续再有同样的请求就能直接从cache中去,cache中放的是一个list。它另外创建了一个名为定位器的类去操纵cache。这个很常用,但经常并未创建定位器,而是直接操纵那个list或者hashmap。

传输对象模式:参数封装到对象中进行传输。
总结:面向对象程序设计。

 

参考文档:https://www.runoob.com/design-pattern/design-pattern-tutorial.html

 

你可能感兴趣的:(JAVA)