
设计模式
文章平均质量分 91
设计模式学习笔记
二木成林
这个作者很懒,什么都没留下…
展开
-
设计模式目录
设计模式概述设计模式学习教程及相关Demo。目录结构设计原则 设计模式之软件设计原则 创建型模式 单例模式 工厂方法模式 抽象工厂模式 原型模式 建造者模式 结构型模式 代理模式 适配器模式 装饰者模式 桥接模式 外观模式 组合模式 享元模式 行为型模式 模板方法模式 策略模式 命令模式 职责链模式 状态模式原创 2021-07-23 22:39:42 · 292 阅读 · 0 评论 -
设计模式之软件设计原则
目录软件设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特原则合成复用原则单一职责原则软件设计原则在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。开闭原则开闭原则:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要原创 2021-07-04 12:01:24 · 508 阅读 · 1 评论 -
设计模式之单例模式
单例模式概念所谓类的单例设计模式(Singleton),就是保证一个类仅有一个实例,并提供一个访问我它的全局访问点。不允许去new它,只能通过一个(静态)方法来获取它的对象实例,如果某类没有定义构造器方法,那么会默认提供一个构造器方法,如果已有则不会,所以也需要将构造器方法用private进行修饰,不允许new该对象。单例模式有如下8种实现方式:饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重原创 2021-03-04 16:23:09 · 753 阅读 · 5 评论 -
设计模式之工厂模式
问题引入需求,设计一个咖啡店点餐系统。设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。 其UML类图如下:实现代码如下:Coffee.javapublic abstract class Coffee { /** * 咖啡名称,抽象方法,必须被实现 * * @return 返回咖啡名称 */.原创 2021-07-06 21:33:20 · 652 阅读 · 1 评论 -
设计模式之原型模式
原型模式问题引入提出问题现在有一个人Person,姓名为:张三、年龄为:19、性别为:男,那么需求就是编写程序创建和Person属性完全相同的10个人。思路分析直接重新创建10个Person对象,然后将原来的Person的属性填充到这10个对象种。代码实现Person.javapublic class Person { private String name; private int age; private String sex; p原创 2021-03-08 18:30:29 · 267 阅读 · 0 评论 -
设计模式之建造者模式
概述在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、体型、服装、发型等特性都有所差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮原创 2021-07-06 22:56:56 · 625 阅读 · 0 评论 -
设计模式之代理模式
问题:代理模式是什么? 使用代理模式有什么好处? 如何使用代理模式?代理模式:为一个对象(即是目标对象)提供一个替身(即是代理对象),来控制对该对象的访问。即通过代理对象来访问目标对象。这样做的好处是在目标对象实现的基础上,增强额外的操作,即扩展了目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。代理模式有不同的形式,主要有三种:静态代理、动态代理(JDK代理、接口代理)和cglib代理。静态代理静态代理的基本介绍静态代理在使用时,需要定义接原创 2021-03-04 16:22:32 · 297 阅读 · 0 评论 -
设计模式之适配器模式
概述在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希原创 2021-07-10 14:48:05 · 317 阅读 · 0 评论 -
设计模式之装饰者模式
概述我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。使用继承的方式存在的问题: 扩展性不好:如果要再加一种配料(火腿肠),我们就会发现需要给FriedRice和FriedNoodles分别定义一个子类。如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子类。 产生过多的子类。 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一原创 2021-07-10 18:41:18 · 394 阅读 · 1 评论 -
设计模式之桥接模式
概述现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实.原创 2021-07-10 21:45:22 · 170 阅读 · 0 评论 -
设计模式之外观模式
外观模式的概念外观模式,在设计模式中归类为结构型模式,它为子系统的众多接口提供了统一的高层接口,使子系统更加容易使用。生活实例比如说食堂的盘装套饭,一个盘子四个坑,一个装米饭,另外三个搭配不同的菜式。解决的问题假如有如下模块中的5个基础功能,对外封装成接口:如果有一个需求,需要先调用接口1再调用接口2最后调用接口5。后面又有需求,需要按照顺序先调用接口4,再调用接口2,最后调用接口5。发现很麻烦,因为需求在不断变更,那么调用的内容也会变更。解决方法如下:将需要原创 2021-03-04 16:23:24 · 258 阅读 · 1 评论 -
设计模式之组合模式
概述组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,树形结构图如下。由上图可以看出,其实根节点和树枝节点本质上属于同一种数据类型,可以.原创 2021-07-11 10:59:24 · 237 阅读 · 0 评论 -
设计模式之享元模式
概述在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象原创 2021-07-11 12:12:09 · 155 阅读 · 0 评论 -
设计模式之模板方法模式
概述在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。这样的例子在生活中还有很多,例如,一个人每天会起床原创 2021-07-12 22:04:19 · 360 阅读 · 0 评论 -
设计模式之策略模式
概述在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用ecli.原创 2021-07-12 22:46:56 · 228 阅读 · 0 评论 -
设计模式之命令模式
概述在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。再比如,我们去餐厅吃饭,菜单不原创 2021-07-13 21:47:27 · 205 阅读 · 0 评论 -
设计模式之责任链模式
概述在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有Strust2的拦截器、JS原创 2021-07-14 23:04:45 · 227 阅读 · 0 评论 -
设计模式之状态模式
概述在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态就会发生改变,从而使其行为也发生改变。如人都有高兴和伤心的时候,不同的情绪有不同的行为,当然外界也会影响其情绪变化。对这种有状态的对象编程,传统的解决方案是:将这些所有可能发生的情况全都考虑到,然后使用 if-else 或 switch-case 语句来做状态判断,再进行不同情况的处理。但是显然原创 2021-07-15 23:18:52 · 214 阅读 · 0 评论 -
设计模式之观察者模式
概述在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观原创 2021-07-17 10:57:44 · 365 阅读 · 0 评论 -
设计模式之中介者模式
概述在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改,这叫作“牵一发而动全身”,非常复杂。如果把这种“网状结构”改为“星形结构”的话,将大大降低它们之间的“耦合性”,这时只要找一个“中介者”就可以了。如前面所说的“每个人必须记住所有朋友电话”的问题,只要在网上建立一个每个朋友都可以访问的“通信录”就解决了。原创 2021-07-17 12:14:22 · 471 阅读 · 1 评论 -
设计模式之迭代器模式
概述在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全; 增加了客户的负担。“迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合原创 2021-07-17 21:28:06 · 235 阅读 · 0 评论 -
设计模式之访问者模式
概述在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银原创 2021-07-17 23:52:58 · 293 阅读 · 4 评论 -
设计模式之备忘录模式
概述备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。定义:又叫快照模式,在不破坏封装性原创 2021-07-18 09:32:12 · 268 阅读 · 0 评论 -
设计模式之解释器模式
概述如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加public static int add(int a,int b){ return a + b;}//用于两个整数相加public static int add(int a,int b,int c){ return a + b + c;}//用于n个整数相加public static int add(Integer ... arr) {.原创 2021-07-18 12:26:53 · 197 阅读 · 0 评论