简单玩转23种Java设计模式_23种设计模式 父子 兄弟-程序员宅基地

技术标签: Java设计模式  

什么是设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应。

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的工作。

设计模式分类

根据设计模式的参考书 《Design Patterns - Elements of Reusable Object-Oriented Software》(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)

模式 & 描述 包括 
创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
结构型模式
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
行为型模式
这些设计模式特别关注对象之间的通信。

我自己的记忆口诀:

创模式5种:单建公园

结构模式7种:四桥外想装阻(拦)

行为模式11种:


父子中间状态兄弟
父子:车模
中间:中介访问者解释
状态:备忘录状态
兄弟:观察者任务迭代命令

设计模式的关系图 

è¾è¡æ¨¡å¼ä¹é´çå³ç³»

设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

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

智能推荐

《Spring实战》读书笔记-第1章 Spring之旅_在spring框架下,熟悉依赖注入的使用。 二、实验内容 (1)编写类db,并在spring配置-程序员宅基地

文章浏览阅读1.3w次,点赞25次,收藏48次。文章目录1.1 简化Java开发1.1.1 激发POJO的潜能1.1.2 依赖注入1.1.3 应用切面1.1.4 使用模板消除样板式代码1.2 容纳你的Bean1.2.1 使用应用上下文1.2.2 bean的生命周期1.3 俯瞰Spring风景线1.3.1 Spring模块1.3.2 Spring Portfolio1.4 Spring的新功能1.4.1 Spring 3.1新特性1.4.2 Sp..._在spring框架下,熟悉依赖注入的使用。 二、实验内容 (1)编写类db,并在spring配置

RouteOS软路由HotSpot热点认证网关添加白名单和黑名单-程序员宅基地

文章浏览阅读389次。1、添加白名单和黑名单地址池白名单IP地址池 172.18.10.0/24黑名单IP地址池 172.18.20.0/242、添加IP网关白名单网关 172.18.10.0/24黑名单网关 172.18.20.0/243、4、5、把主机的MAC地址绑定到特定的黑名单IP地址,下次登录就会获取到黑名单的IP地址将..._winbox软路由白名单ip

大数据之hadoop中MapReduce框架原理_import org.apache.hadoop.mapreduce.reducer的功能是什么-程序员宅基地

文章浏览阅读1.1k次。1、概述MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序,并发运行在一个 Hadoop 集群上。 优点:易于编程(用户只关心业务逻辑即可)、良好的扩展性(可以动态增加服务器)、高容错性(任意一台机器挂掉,可以将任务转移到另一节点)、适合海量数据计算(PB/BP) 缺点:不擅长实时计算、不擅..._import org.apache.hadoop.mapreduce.reducer的功能是什么

ROS运行错误:无法连接到ROS master,ERROR: unable to contact ROS master at [http://192.168.0.20:11311]_rotmaster报错是个无效的robotmaster-程序员宅基地

文章浏览阅读3.9k次。https://blog.csdn.net/xiaodingqq/article/details/87690563遇到的错误:_rotmaster报错是个无效的robotmaster

正交矩阵-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏9次。正交矩阵是实数特殊化的酉矩阵,因此总是正规矩阵。尽管我们在这里只考虑实数矩阵,这个定义可用于其元素来自任何域的矩阵。正交矩阵毕竟是从内积自然引出的,对于复数的矩阵这导致了归一要求。定义  定义 1  如果:AA'=E(E为单位矩阵,A'表示“矩阵A的转置矩阵”。)或A′A=E,则n阶实矩阵 A称为正交矩阵, 若A为正交阵,则满足以下条件:  ..._正交矩阵

error:(-215: Assertion filed)p.checkVector(2,cv 32S)>=0 in function cv::fillPoly错误原因OpenCV Python_(-215:assertion failed) p.checkvector(2, cv_32s) >-程序员宅基地

文章浏览阅读4.2k次。如下图所示,左边无用白块太多,而且线基本到不了左边那一块,所以想弄个掩模把左边弄成纯黑色。下图是打算使用的掩模下图是原来的程序,结果报错,错误如标题所示。# 掩模创建def roi_mask(img,corner1_points,corner2_points): mask = np.zeros_like(img) cv.fillPoly(mask,corne..._(-215:assertion failed) p.checkvector(2, cv_32s) >= 0 in function 'cv::polyl

随便推点

合约安全实战两则_合约最安全的操作方法-程序员宅基地

文章浏览阅读407次。1.//0x202E653dA93c2a06076FC95B0A07E39B6003C5f6 Ropstenpragma solidity ^0.4.23;/** * The CoinFlip contract does nothing... */contract CoinFlip { uint256 lashHash; uint256 Factor = 20244007718664171871063861089; mapping (address => uint)._合约最安全的操作方法

oracle for循环 break,Ruby循环 while, for, until, break, redo 和 retry-程序员宅基地

文章浏览阅读341次。Ruby中的循环用于执行相同的代码块指定的次数。本章将详细介绍Ruby支持的循环语句。Rubywhile语句:语法:whileconditional[do]codeend执行代码当条件为true时。while循环的条件是代码中的保留字,换行,反斜杠()或一个分号隔开。实例:#!/usr/bin/ruby$i=0$num=5while$i这将产生以下结果:Insidethe loop i=0In..._oracle break

使用node.ls和vue脚手架开发H5页面的上滑下拉滑动分页感悟_h5单页面开发有什么脚手架-程序员宅基地

文章浏览阅读456次。安装node.js安装node教程官网下载安装首先访问node.js的官方网站,下载你需要的node.js版本,然后选择安装,进入官网首页就会有下载提示,如下图所示,根据提示一步一步的来安装检查是否安装成功打开windows的命令行或者使用快捷键win + r,输入node -v出现以下信息表示安装成功,会显示你安装的node版本号通过上述两个步骤就已经完成对node.js的安装..._h5单页面开发有什么脚手架

内核错误: No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘_no rule to make target 'debian/canonical-certs.pem-程序员宅基地

文章浏览阅读3.2w次,点赞42次,收藏139次。编译内核报错解决方案编辑.config文件vim .config修改CONFIG_SYSTEM_TRUSTED_KEYS,将其置空。# 将该项原有内容删掉即可,如下CONFIG_SYSTEM_TRUSTED_KEYS=""重新编译内核,问题解决。_no rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_c

Axure RP Pro - 相关问题 - OnMouseOver事件和Rollover翻转效果浏览器不兼容_axure onmouseover-程序员宅基地

文章浏览阅读3.1k次。 Axure RP Pro - 相关问题 - OnMouseOver事件和Rollover翻转效果浏览器不兼容Axure RPPro中包括OnMouseOver事件和Rollover翻转效果,但是在不同浏览器中的效果却不一致。例如,当拥有OnMouseOver事件的部件或Rollover翻转效果的部件的上方有动态面板时,如果该动态面板中并没有内容遮盖在部件的上方,但是在Firefox浏览器_axure onmouseover

MySql中重新设置AUTO_INCREMENT自增值方法_set auto_increment-程序员宅基地

文章浏览阅读3.4w次,点赞3次,收藏13次。查询表名为tableName的auto_increment值:SELECT AUTO_INCREMENT FROM information_schema.tables WHEREtable_name='tableName';修改表名为tableName的auto_increment值:ALTER TABLE tableName auto_increment=number ;_set auto_increment

推荐文章

热门文章

相关标签