
设计模式
文章平均质量分 86
技术路上的苦行僧
不怕别人天赋比你高,就怕别人比你更努力
展开
-
设计模式(31)之责任链模式
一、OA系统的采购审批需求学校OA系统的采购审批项目:需求是:采购员采购教学器材; 如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000); 如果金额 小于等于10000, 由院长审批 (5000<x<=10000); 如果金额 小于等于30000, 由副校长审批 (10000<x<=30000); 如果金额 超过30000以上,有校长审批 ( 30000<x);1.1传统方式解决OA审批问题 类图...原创 2021-12-09 10:59:05 · 215 阅读 · 0 评论 -
设计模式(30)之策略模式
一、鸭子问题 编写鸭子项目,具体要求如下:有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等) 显示鸭子信息1.1传统方案解决鸭子问题 传统方案解决类图如下:具体代码如下:public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //测试 }}public clas...原创 2021-12-09 10:17:02 · 211 阅读 · 0 评论 -
设计模式(29)之状态模式
一、APP活动抽奖问题请编写程序完成APP抽奖活动 具体要求如下:假如每参加一次这个活动要扣除用户50积分,中奖概率是10%; 奖品数量固定,抽完就不能抽奖; 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完; 活动的四个状态转换关系图,如下图:二、状态模式 2.1前言在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。...原创 2021-12-08 15:45:50 · 213 阅读 · 0 评论 -
设计模式(28)之解释器模式
一、四则运算问题通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求:先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复; 在分别输入a ,b, c, d, e 的值;在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。二、解释器模式 解释器(Interpreter)模式的定义:...原创 2021-12-08 15:20:19 · 501 阅读 · 0 评论 -
设计模式(27)之备忘录模式
一、游戏角色状态恢复需求游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。 1.1传统方式解决状态恢复问题 传统方式解决具体类图如下: 1.2 传统方式解决存在的问题 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管理,开销也很大; 传统的方式是简单地做备份,new出另外一个对象出来,再把需...原创 2021-12-08 14:40:38 · 2219 阅读 · 0 评论 -
设计模式(26)之中介者模式
一、前言 在现实生活中,很多对象之间存在着复杂的关系,种交互关系常常是“网状结构”,他要求每个对象都必须记得他需要交互的对象。例如,每个人必须记住他(她)所有朋友的电话;而且,朋友中如果有人的电话修改了,他(她)必须让其他所有的朋友一起修改,这叫作“牵一发而动全身”,非常复杂。 在软件开发过程中,这样子的例子也很多,例如,在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。所有这些,都可以采用“中...原创 2021-12-08 10:00:52 · 160 阅读 · 0 评论 -
设计模式(25)之观察者模式
一、前言 在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。1.1天气预报的项目需求、天气预报项目需求,具体要求如下:气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去...原创 2021-12-07 17:52:29 · 391 阅读 · 0 评论 -
设计模式(24)之迭代器模式
一、前言在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全; 增加了客户的负担“迭代器...原创 2021-12-02 17:09:00 · 207 阅读 · 0 评论 -
设计模式(23)之访问者模式
一、前言在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,...原创 2021-12-02 15:08:09 · 147 阅读 · 0 评论 -
设计模式(22)之命令模式
一、智能生活项目需求看一个具体的需求:我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电。 要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这时 就可以考虑使用命令模式。 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来. 在我们的例子中,动作...原创 2021-12-02 11:19:59 · 602 阅读 · 0 评论 -
设计模式(21)之模板模式
一、需求问题-制作豆浆问题 编写豆浆的制作流程,说明如下:制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎; 通过添加不同的配料,可以制作出不同口味的豆浆; 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的; 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )。 二、模板模式2.1前言 在面向对象程序设计...原创 2021-12-01 15:43:02 · 311 阅读 · 0 评论 -
设计模式(20)之代理模式
一、前言 在有一些情况下,一个客户不想或者不能直接访问一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像)等,其下载需要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。二、代理模式 ...原创 2021-11-30 19:52:43 · 285 阅读 · 0 评论 -
设计模式(19)之享元模式
一、享元模式介绍在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。 例如:围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。 1.1享元模式的定义享元(Flyweight)模式的定...原创 2021-11-30 14:19:07 · 250 阅读 · 0 评论 -
设计模式(18)之外观模式
一、前言在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。图 1 给出了客户去当地房产局办理...原创 2021-11-29 19:29:14 · 167 阅读 · 0 评论 -
设计模式(17)之组合模式
一、前言在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。 例如我们要解决这样子的一个需求问题:学校院系展示需求,编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院...原创 2021-11-29 17:28:03 · 4941 阅读 · 0 评论 -
设计模式(16)之装饰者模式
一、星巴克咖啡订单需求星巴克咖啡订单项目(咖啡馆):咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)。 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便。 使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。1.1方案一方案1-解决星巴克咖啡订单问题分析:Drink 是一...原创 2021-11-26 17:00:31 · 299 阅读 · 1 评论 -
设计模式(15)之桥接模式
一、手机问题在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。现在对不同手机类型的不同品牌实现操作编程(比如: 开机、关机、上网,打电话等),如图: 1.1传统方式手机问题传统方案解决手机使用问题(类图)...原创 2021-11-25 19:34:01 · 458 阅读 · 0 评论 -
设计模式(14)之适配器模式
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。 在软件设计中也可能会遇到这样子的问题:需要开发具有某种业务功能的组件在现有的组件库中已经存在,但它们与现在系统的接口不兼容,如果重新开发这些组件成本又高,这时候用适配器就能够很多的解决这个问题。一、适配器模式 ...原创 2021-11-24 11:29:30 · 257 阅读 · 0 评论 -
设计模式(13)之建造者模式
一、需求案例盖房项目需求:需要建房子:这一过程为打桩、砌墙、封顶 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的. 请编写程序,完成需求.1.1传统方式编码解决public class Client { public static void main(String[] args) { // TODO Auto-generated method stub CommonHouse commonHouse = new Commo...原创 2021-11-22 15:42:39 · 154 阅读 · 0 评论 -
设计模式(12)之原型模式
设计模式原创 2021-11-19 17:49:06 · 163 阅读 · 0 评论 -
设计模式(11)之工厂模式
一、工厂模式介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分,工厂模式有 3 ...原创 2021-11-17 17:15:18 · 224 阅读 · 0 评论 -
设计模式(10)之单例模式
一、设计模式介绍设计模式对程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式的本质是提高软件的维护性、通用性和拓展性,并降低软件的复杂度。 设计模式并不局限于某种语言,java、PHP、C++都有设计模式。1.1设计模式类型 设计模型分有三种类型:创建型模式、结构型模式和行为型模式。创建型...原创 2021-11-16 17:52:40 · 258 阅读 · 0 评论 -
设计模式(9)之七大原则之UML图
一、UML基本介绍 UML-Unified Modeling Language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具。它用于帮助软件开发人员进行思考和记录思路的结果。 UML本身就是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和它们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合、关联等。如下图:二、UML图 画UML图其实跟写文章差不多,就是把自己的思路描...原创 2021-11-15 11:28:27 · 628 阅读 · 0 评论 -
设计模式(8)之七大原则之七大原则总结
一、总结结合前几节的内容,我们一共介绍了 7 种设计原则,它们分别为开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则和合成复用原则。这 7 种设计原则是软件设计模式必须尽量遵循的原则,是设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景遵循设计原则。这体现的是一种平衡取舍,可以帮助我们设计出更加优雅的代码结构。各种原则要求的侧重点不...原创 2021-11-14 22:16:42 · 222 阅读 · 0 评论 -
设计模式(7)之七大原则之合成复用原则
一、定义合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。 1.1合成复用原则的重要性通...原创 2021-11-12 10:46:49 · 445 阅读 · 0 评论 -
设计模式(6)之七大原则之迪米特原则
一、定义迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。一个类应该对其他保持...原创 2021-11-11 17:21:57 · 919 阅读 · 0 评论 -
设计模式(5)之七大原则之开闭原则
一、定义开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。 开闭原...原创 2021-11-11 15:12:40 · 1150 阅读 · 0 评论 -
设计模式(4)之七大原则之里氏替换
一、定义 1.1关于OOP的一些思考继承包含这么一层含义:父类凡是已经实现好的方法,实际上是设定规范和契约,虽然他不强制所有的子类必须遵循这些契约,但是如果子类对这些方法进行任意修改,就会对这个继承体系造成破坏。 继承给程序设计带来便利的同时也带来了弊端,比如继承会给程序带来侵入性,程序的可移植性低,增减对象间的耦合性,如果一个类被其他类继承,则当这个类需要修改的时候,就必须考虑到所有的子类,并且父类修改后,所有涉及到的子类都有可能产生故障。 问题提出?如果正确的使用继承 ===&...原创 2021-11-10 16:06:59 · 207 阅读 · 0 评论 -
设计模式(3)之七大原则之依赖倒转
一、定义依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象; 抽象不应该依赖细节,细节应该依赖抽象; 依赖倒装的中心思想就是:面向接口编程; 依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。他的设计理念是这样子的,相对于细节的多变性,抽象的东西要稳定得多。以抽象为基础的架构比以细节搭建的架构要稳定得多。在java中,抽象指的就是接口或者是抽象类,细节就是具体的实现类。使用接口或者抽象类的目的...原创 2021-11-09 14:36:41 · 473 阅读 · 0 评论 -
设计模式(2)之七大原则之接口隔离
一、定义接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小...原创 2021-11-08 20:25:15 · 184 阅读 · 0 评论 -
设计模式(1)之七大原则之单一职责
一、定义单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。该原则提出对象不应该承...原创 2021-11-08 20:13:37 · 179 阅读 · 0 评论 -
多线程设计模式(Future模式和Master-Worker模式)
一、多线程的设计模式多线程的设计模式 并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍Future、Master-Worker和生产者-消费者模式。Future模式 对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个...原创 2018-07-07 22:28:26 · 353 阅读 · 0 评论 -
多线程并行设计模式之Master-Worker模式
Master-Worker模式的核心思想是在于Master进程和Worker进程各自分担各自的任务,协同完成信息处理的模式 使用一个图例来简单描述一下: 如图所示Master-Worker的工作机制就是Master接收到了一个任务,对任务进行拆分,并且分配给各个Worker,让各个Worker之间各自运行各自的子任务,最后Worker们的返回结果交给Master进行汇总并且最后返回给任务的发起方...转载 2018-07-09 00:21:29 · 614 阅读 · 0 评论 -
设计模式之策略模式详解
策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。 比如说我们要做这么一个项目,一个关于鸟的种类的项目,首先我们先抽象出一个Bird类,那么如果我们需要给这个Bird添加飞行的能力,我们想一下有几种解决方案:1.继承:既然我们是面向对象编程,可以在父类中实现一个飞行的方法,子类中就可以继承父类的飞行方法。这样子的方法是简单易用,但是有一个很大的缺点就是不具有灵活性原创 2017-11-06 16:12:52 · 239 阅读 · 0 评论 -
设计模式之适配器模式详解
**适配器模式**适配器模式的官方定义:将一个类的接口转换为客户期望的另外的一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 目的:消除由于接口不匹配造成的类的不兼容问题。 分类:有三类,主要是类的适配器模式,对象的适配器模式,接口的适配器模式。1.类的适配器模式 核心思想:有一个源目标类,有一个method1()方法,目标接口是Targetable接口,通过适配器A原创 2017-11-06 15:06:35 · 303 阅读 · 0 评论