设计模式_设计模式 ` 一个类只负责一个功能领域中的相应职责-程序员宅基地

技术标签: java  设计模式  

简介

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式可以提高代码的可复用性可维护性可读性稳健性以及安全性。 项目中合理地运用设计模式可以完美地解决很多问题,但滥用设计模式不但不会带来任何好处,还会带来很多负面影响,所以学习设计模式是每个程序员进阶的必经之路!其中设计模式主要基于以下的两个面向对象设计原则:

  • 对接口编程而不是对实现编程
  • 优先使用对象组合而不是继承

设计模式类型

根据参考书 Design Patterns - Elements of Reusable Object-Oriented Software (中文译名:设计模式 - 可复用的面向对象软件元素)中所述,总共有23种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)结构型模式(Structural Patterns)行为型模式(Behavioral Patterns)。但是请注意,这里的23种设计模式,只是Gang of Four(四人帮)几位大佬们,经过多年总结提炼出来的最经典的设计模式,而不是设计模式一共这么多,我们随便写一个模式都可以称为设计模式,只是没什么软用而已。

创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。可以用于解耦对象的实例化过程。例如Spring框架中大量用到了创建模式,帮助用户管理对象的创建过程,以达到解耦的目的!

  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者(生成器)模式(Builder Pattern)
  • 原型模式(Prototype Pattern)
结构型模式

这些设计模式关注类和对象的组合,把类或对象结合在一起形成一个更大的结构。

  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)
行为型模式

这些设计模式特别关注对象之间的通信,以及类和对象如何交互,及划分责任和算法。

  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)

如下图所示:
在这里插入图片描述

设计模式的七大原则

  • 单一职责原则(Single Responsibility Principle)
    单一职责原则的意思是一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因
  • 开闭原则(Open Close Principle)
    开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。
  • 里氏代换原则(Liskov Substitution Principle)
    里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
  • 依赖倒转原则(Dependence Inversion Principle)
    这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体
  • 接口隔离原则(Interface Segregation Principle)
    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度
  • 迪米特法则,又称最少知道原则(Demeter Principle)
    最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立
  • 合成复用原则(Composite Reuse Principle)
    合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承

这七大原则是所有设计模式的基础,也是最重要的思想部分,但我们要明白,没有一种设计模式是最完美的,只有最适合的,甚至在某些场景下,有的设计模式会违反以上的七大原则

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22136439/article/details/105050568

智能推荐

连登 GitHub TOP 榜,中国开发者在行动!_连登 技术-程序员宅基地

文章浏览阅读1.2w次,点赞86次,收藏87次。中国开发者对于疫情的整体关注程度及防护方向。_连登 技术

java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署-程序员宅基地

文章浏览阅读37次。java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署。springboot基于Vue.js的云医疗自助就诊平台的设计与实现。前端技术:Layui、HTML、CSS、JS、JQuery等技术。springboot颜如玉图书销售网站的设计与实现。springboot竞赛信息发布及组队系统。springboot郑财校园新闻管理系统。springboot校园任务发布系统。

对jupyter notebook运行时出现“The kernel appears to have died. It will restart automatically”的解决方案_用jupyternotebook训练模型总是the kernel appears to have d-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏21次。1、前天在jupyter notebook 上运行tensorflow的代码时(主要是卷积神经网络,用小笔记本上的GPU),运行没多久,出现“The kernel appears to have died. It will restart automatically”。试了很多遍,一直都是这样。但是又运行之前的Tensorflow基础运算和全连接神经网络的程序,都可以运行,只有开始跑卷积神经网..._用jupyternotebook训练模型总是the kernel appears to have died. it will restar

redisson分布式锁组合spring事务解决锁被释放但事务还未被提交的问题_redis分布式锁释放了,业务还没处理完-程序员宅基地

文章浏览阅读2.6k次,点赞10次,收藏25次。定义的注解里面建议组合spring的Transactional注解 这样的话,使用者能够定义像传播特性、隔离级别等之类的属性,而不需要我们重新定义/**// 开启事务 如果不需要组合的话 可选择使用此注解 // 但需要稍微改一下后续的代码 // boolean transactional() default false;// 组合事务注解 最推荐 很方便 Transactional transactional();// 开启锁 boolean lock() default true;_redis分布式锁释放了,业务还没处理完

python asyncio和celery对比_如何将Celery与asyncio结合? - python-程序员宅基地

文章浏览阅读222次。如何创建使芹菜任务看起来像asyncio.Task的包装器?还是有更好的方法将Celery与asyncio集成?@ asksol,Celery的创建者said this::使用Celery作为异步I / O框架之上的分布式层是很常见的(提示:将CPU绑定的任务路由到prefork worker意味着它们不会阻塞事件循环)。但是我找不到任何专门针对asyncio框架的代码示例。参考方案如官方网站中所..._asyncio和celery

5种靶机安装(dvwa pikachu mutillidae mcir bwapp)_如何在靶机上安装软件-程序员宅基地

文章浏览阅读823次,点赞2次,收藏3次。**一 ,安装XAMPP软件,安装Gvim编辑器,火狐浏览器,360压缩,必须有固定的的IP地址。软件在360官网进行安装(本次安装时 Server Windows 2016)xampp安装过程登录本地网络管理器修改phpMyAdmin数据库密码修改配置文件密码登录重新登录数据库,安装前提完成。安装前提完成开始安装1,bwapp 端口:82 地址 172.16.12.100:82/install.php2,mcir 端口:83 地址_如何在靶机上安装软件

随便推点

OpenJudge-1.3.15:苹果和虫子_openjudge苹果和虫子-程序员宅基地

文章浏览阅读267次。OpenJudge-1.3.15:苹果和虫子_openjudge苹果和虫子

深入理解代理模式:静态代理与JDK动态代理_jdk 代理是静态代理-程序员宅基地

文章浏览阅读1.3w次,点赞32次,收藏140次。摘要:      代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是Spring AOP的实现基础。通过阅读本文,读者将会对代理模式和Java动态..._jdk 代理是静态代理

jquery checkbox全选,全不选,反选方法,jquery checkbox全选只能操作一次_js只能全选一次-程序员宅基地

文章浏览阅读334次。jquery checkbox全选,全不选,反选方法,jquery checkbox全选只有第一次成功jquery checkbox全选只能操作一次,下载Js代码 /** * 全选 * 对于Jquey1.7.2+版本,使用attr会造成只能操作一次。 * 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。 _js只能全选一次

JAVA微信小程序论坛系统毕业设计 开题报告_论坛微信小程序设计报告-程序员宅基地

文章浏览阅读3.5k次,点赞6次,收藏54次。本课题主要目标是设计并能够实现一个基于微信小程序论坛交流系统,前台用户使用小程序,后台管理使用Java+Mysql开发,后台使用了springboot框架;通过后台设置录入资讯、管理用户、设置轮播图、管理交流主题和回复管理;用户通过小程序登录,查看资讯、查看交流帖子、发起帖子、回复帖子等。_论坛微信小程序设计报告

command C:\Windows\system32\cmd.exe /d /s /c node ./build.js的解决方法_npm err! command c:\windows\system32\cmd.exe /d /s-程序员宅基地

文章浏览阅读3.6k次。npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node ./build.js_npm err! command c:\windows\system32\cmd.exe /d /s /c node scripts/build.js

c32循迹小车c语言程序,stm32篇--小车循迹-程序员宅基地

文章浏览阅读1.3k次。小车的循迹算法循迹小车使用红外对射寻黑线,根据轨道的不同,我使用了两种不同算法:(1)第一种是在轨道外有影响的,比如轨道外有黑色,车出去一点就会碰到黑色,那就是检测到歪了之后除非检测它回来了,否则一直拐弯://自己寻道void Self_Tracting(void){while(1){test_sensor();motor_move_speed(paras.speed);if(GPIO_ReadI..._寻迹小车怎么用c语言在拐歪处区分两条黑线