JAVA23种设计模式全⾯解析
⼀、什么是设计模式
设计模式(Design pattern) 是解决软件开发某些特定问题⽽提出的⼀些解决⽅案也可以理解成解决问题的⼀些思路。通过设计模式可以帮助我们增强代码的可重⽤性、可扩充性、 可维护性、灵活性好。我们使⽤设计模式最终的⽬的是实现代码的⾼内聚和低耦合。
⼆、设计模式的三⼤分类及关键点
1、创建型模式
对象实例化的模式,创建型模式⽤于解耦对象的实例化过程。
单例模式:某个类智能有⼀个实例,提供⼀个全局的访问点。
⼯⼚模式:⼀个⼯⼚类根据传⼊的参量决定创建出哪⼀种产品类的实例。
抽象⼯⼚模式:创建相关或依赖对象的家族,⽽⽆需明确指定具体类。
建造者模式:封装⼀个复杂对象的创建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
2、结构型模式
把类或对象结合在⼀起形成⼀个更⼤的结构。
装饰器模式:动态的给对象添加新的功能。
代理模式:为其它对象提供⼀个代理以便控制这个对象的访问。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独⽴的变化。
适配器模式:将⼀个类的⽅法接⼝转换成客户希望的另⼀个接⼝。
组合模式:将对象组合成树形结构以表⽰“部分-整体”的层次结构。
外观模式:对外提供⼀个统⼀的⽅法,来访问⼦系统中的⼀接⼝。
享元模式:通过共享技术来有效的⽀持⼤量细粒度的对象。
3、⾏为型模式
类和对象如何交互,及划分责任和算法。
策略模式:定义⼀系列算法,把他们封装起来,并且使它们可以相互替换。
模板模式:定义⼀个算法结构,⽽将⼀些步骤延迟到⼦类实现。
命令模式:将命令请求封装为⼀个对象,使得可以⽤不同的请求来进⾏参数化。
迭代器模式:⼀种遍历访问聚合对象中各个元素的⽅法,不暴露该对象的内部结构。
观察者模式:对象间的⼀对多的依赖关系。
仲裁者模式:⽤⼀个中介对象来封装⼀系列的对象交互。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
解释器模式:给定⼀个语⾔,定义它的⽂法的⼀种表⽰,并定义⼀个解释器。
状态模式:允许⼀个对象在其对象内部状态改变时改变它的⾏为。
责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
访问者模式:不改变数据结构的前提下,增加作⽤于⼀组对象元素的新功能。
三、设计模式的⼏种原则
1、单⼀职责原则
对于⼀个类,只有⼀个引起该类变化的原因;该类的职责是唯⼀的,且这个职责是唯⼀引起其他类变化的原因。
2、接⼝隔离原则
客户端不应该依赖它不需要的接⼝,⼀个类对另⼀个类的依赖应该建⽴在最⼩的接⼝上。
3、依赖倒转原则
java可以开发什么软件依赖倒转原则是程序要依赖于抽象接⼝,不要依赖于具体实现。简单的说就是要求对抽象进⾏编程,不要对实现进⾏编程,这样就降低了客户与实现模块间的耦合。
4、⾥式代换原则
任何基类可以出现的地⽅,⼦类⼀定可以出现。⾥⽒代换原则是继承复⽤的基⽯,只有当衍⽣类可以替换基类,软件单位的功能不受影响时,基类才能真正的被复⽤,⽽衍⽣类也能够在基类的基础上增加新的⾏为。⾥⽒代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化。⽽基类与⼦类的继承关系就是抽象化的具体实现,所以⾥⽒代换原则是对实现抽象化的具体步骤的规范。
5、开闭原则
(1)对于扩展是开放的(Open for extension)。这意味着模块的⾏为是可以扩展的。当应⽤的需求改变时,我们可以对模块进⾏扩展,使其具有满⾜那些改变的新⾏为。也就是说,我们可以改变模块的功能。
(2)对于修改是关闭的(Closed for modification)。对模块⾏为进⾏扩展时,不必改动模块的源代码或者⼆进制代码。模块的⼆进制可执⾏版本,⽆论是可链接的库、DLL或者.EXE⽂件,都⽆需改动。
6、迪⽶特法则
迪⽶特法则⼜叫做最少知识原则,就是说⼀个对象应当对其它对象⼜尽可能少的了解,不和陌⽣⼈说话。
7、合成复⽤原则
合成复⽤原则要求在软件复⽤时,要尽量先使⽤组合或者聚合等关联关系来实现,其次才考虑使⽤继承关系来实现。如果要使⽤继承关系,则必须严格遵循⾥⽒替换原则。合成复⽤原则同⾥⽒替换原则相辅相成的,两者都是开闭原则的具体实现规范。
设计模式七⼤原则总结(超详细)
四、设计模式关系
五、设计模式感想
⼀共有23种设计模式,可以说都是为了提⾼代码的可读性、可扩展性、可复⽤性、类的可替换性、组件化、可移植性等等特性。通过接⼝、抽象类、继承、实现、委托、抽象、⾯向接⼝编程、多态、重载、重写等⽅式使得代码的这些特性得以彰显,可以说只有深刻的理解了这些概念背后的哲学思想才能更好的理解设计模式。在设计模式中有很多思想,⽐如可以使⽤委托的不要使⽤继承、开闭原则,⾯向扩展开放,⾯向修改关闭,⾥式代换原则,⽗类⼀定能被⼦类代替并使⽤,反置则不然,⾯向接⼝编程,功能层次和实现层次分离(桥接模式)、⾼内聚低耦合等思想,这些思想都是宝贵的,正是因为这样的思想的存在才使得代码的更新换代的时候能够尽可能少的甚⾄不⽤修改之前的代码,直接加⼊新的内容。提⾼软件的开发周期,便于维护和升级,便于查和纠错,易于扩展和使⽤。
同样的设计模式主要分为三⼤类,创建型、⾏为型、结构型。我们可以简单的这样分类,只不过这样的分类似乎并不准确,不能⼀语道出所有的本质,设计模式是相互关联的,有的设计模式内部其实是使⽤了别的设计模式作为⽀撑的,但是⼤体上这样的⼀种划分便于我们去记忆,仅此⽽已。
六、设计模式回顾
从迭代器开始,我们将类中数据结构的遍历和类的功能实现分离出来,本质上使⽤了⼯⼚模式;
其次我们学习了适配器模式,它将不同的接⼝进⾏适配,从⽽便于版本的兼容性以及其他功能;
然后我们学习了模板⽅法,使⽤模板⾯向抽象编程,便于新的⼦类的实现和管理;
之后学习了⼯⼚模式,其实借⽤了模板模式来创建产品,是⼀种⾮常重要⽤处很⼴的⼀种⽅法;
然后我们学习了单例模式,有懒汉式、饿汉式等,⽣成关于某个类全局唯⼀的对象,注意多线程的影
响;
之后是原型模式,⽤来复制复杂的对象,使⽤了clone⽅法,然后是builder模式,⽤⼀个新的类对已有的抽象接⼝进⾏整合和编程,从⽽构建出我们想要的东西;
然后是抽象⼯⼚模式,使⽤了⼯⼚模式,组合模式等模式,⾯向抽象编程,将抽象零件组装成抽象产品,便于具体⼯⼚的创建,提⾼了代码的组件化和复⽤性;
然后是桥接模式,将类的功能层次和实现层次分割开来,便于对应的扩展和使⽤;
然后是策略模式,可以整体的替换策略,使⽤也很⼴泛;然后是组合模式,保证了同根同源,通过委托添加⾃⼰构成递归,树形结构,将具有树形特点的对象组合起来;
然后是装饰器模式,和组合模式的结构类似,同样是递归结构,从⽽可以不断的装饰,增加新的功能,很好⽤;
接着是visitor访问者模式,通过在类外访问类中的数据结构从⽽得到想要的结果,便于程序的可扩展性和组件化;
接着是责任链模式,推卸责任,根据问题的⼤⼩来考虑⾃⼰释放处理,本质是链表,便于职责分明;
然后是外观模式,通过整合各个类之间的调⽤关系,组建成了统⼀的接⼝(API),便于外部类的调⽤;
接着是仲裁者模式,将很多类之间互相关联的关系交给仲裁者处理,省去了各个类之间的嵌套和调动,有利于⾼内聚和低耦合,思路清晰,便于扩展;
然后是观察者模式,通过互相委托从⽽能够在被观察的类发⽣改变的时候得到相应的改变的信息并且处理;
然后是备忘录模式,通过在某⼀时刻的状态保存下来,便于恢复,在游戏中使⽤的⽐较多;
然后是状态模式,将状态当做类,从⽽职责分明,解除了很多繁琐的if和else这些分⽀逻辑,便于扩展;
然后是享元模式,轻量级对象,通过共⽤不变对象来实现;
然后是代理模式,懒加载真正的服务器,加快访问速度,代理是帮助服务器代理的;
然后是命令模式,将命令当做类,通过保存⼀些列命令,从⽽能够随时执⾏这些命令,需要清除命令的本质就是⼀些操作和数据;
最后是解释器模式,利⽤编程原理的⽅法,来更⾼层次的封装代码,将⾃⼰开发的java代码当做编译系统,从⽽不⽤改变java代码只修改更⾼语⾔层次的代码就能实现不同的功能。
每⼀篇博客都是⼀种经历,程序猿⽣涯的痕迹,知识改变命运,命运要由⾃⼰掌控,愿你游历半⽣,归来仍是少年。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论