![](https://img-blog.csdnimg.cn/20210108172313185.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
文章平均质量分 54
GOF23
plenilune-望月
这个作者很懒,什么都没留下…
展开
-
设计模式(二十六)设计模式GOF23-汇总总结
• GOF23中设计模式一览表创建型模式 结构型模式 行为型模式 简单工厂模式 抽象工厂模式 工厂方法模式 单例模式 建造者模式 原型模式 适配器模式 桥接模式 组合模式 装饰器模式 外观模式 享元模式 代理模式 责任链模式 解释器模式 模板方法模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 • 创建原创 2021-01-11 09:19:51 · 78 阅读 · 0 评论 -
设计模式(二十五)行为型模式-备忘录模式 menmento
• 场景:– 录入大批人员资料。正在录入当前人资料时,发现上一个人录错了,此时需要恢复上一个人的资料,再进行修改。– Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word提示你恢复到以前的文档– 管理系统中,公文撤回功能。公文发送出去后,想撤回来。• 核心– 就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。• 结构:– 源发器类Originator– 备忘录类Memento– 负责人类CareTaker• 代码的类图原创 2021-01-11 09:19:25 · 415 阅读 · 0 评论 -
设计模式(二十四)行为型模式-观察者模式 Observer
• 广播机制的场景:• 场景:– 聊天室程序的创建。服务器创建好后,A,B,C三个客户端连上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别发给其他在线的客户。也就是说,每个客户端需要更新服务器端得数据。– 网站上,很多人订阅了”java主题”的新闻。当有这个主题新闻时,就会将这些新闻发给所有订阅的人。– 大家一起玩CS游戏时,服务器需要将每个人的方位变化发给所有的客户。上面这些场景,我们都可以使用观察者模式来处理。我们可以把多个订阅者、客户称之为观察原创 2021-01-11 09:19:01 · 117 阅读 · 0 评论 -
设计模式(二十三)行为型模式-状态模式 state
• 场景:– 电梯的运行 • 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态– 红绿灯 • 红灯、黄灯、绿灯– 企业或政府系统 • 公文的审批状态 – 报销单据审批状态 – 假条审批– 网上购物时,订单的状态 • 下单 • 已付款 • 已发货 • 送货中 • 已收货– 酒店系统中,房间的状态变化: • 已预订 • 已入住 • 空闲if(state==" 空闲")...原创 2021-01-11 09:18:36 · 85 阅读 · 0 评论 -
设计模式(二十二)行为型模式-模板方法模式 template method
• 场景:– 客户到银行办理业务:1、取号排队2、办理具体现金/转账/企业/个人/理财业务3、给银行工作人员评分• 模板方法模式介绍:– 模板方法模式是编程中经常用得到的模式。它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。• 核心:– 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类中定义原创 2021-01-11 09:18:08 · 138 阅读 · 0 评论 -
设计模式(二十一)行为型模式-策略模式 strategy
• 场景:– 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:• 普通客户小批量报价• 普通客户大批量报价• 老客户小批量报价• 老客户大批量报价– 具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。• 我们先可以采用条件语句处理:实现起来比较容易,符合一般开发人员的思路public double getPrice(String type, double price){ if(type.equal原创 2021-01-11 09:17:23 · 102 阅读 · 0 评论 -
设计模式(二十)行为型模式-访问者模式 Visitor
• 模式动机:– 对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同。• 定义:– 表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变个元素的类的前提下定义作用于这些元素的新操作。• 开发中的场景(应用范围非常窄,了解即可):– XML文档解析器设计– 编译器的设计– 复杂集合对象的处理...原创 2021-01-08 14:34:19 · 76 阅读 · 0 评论 -
设计模式(十九)行为型模式-解释器模式 Interpreter
仅做了解• 介绍:– 是一种不常用的设计模式– 用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。– 当我们需要开发一种新的语言时,可以考虑使用解释器模式。– 尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用Jruby,Groovy、java的js引擎来替代解释器的作用,弥补java语言的不足。• 开发中常见的场景:– EL表达式式的处理– 正则表达式解释器– SQL语法的解释器– 数学表达式解析器•原创 2021-01-08 14:27:51 · 108 阅读 · 0 评论 -
设计模式(十八)行为型模式-命令模式 command
• 介绍:– 命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式、事务transaction模式。• 结构:– Command抽象命令类– ConcreteCommand具体命令类– Invoker调用者/请求者• 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要再设计时确定其接收者,因此它只与抽象命令类之间存在关联。在程序运行时,将调用命令对象的execute.原创 2021-01-08 13:22:08 · 62 阅读 · 0 评论 -
设计模式(十七)行为型模式-中介者模式 mediator
• 中介大家熟悉吗?• 场景(中介大家熟悉吗?房产中介?):– 假如没有总经理。下面三个部门:财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。 虽然只有三个部门,但是关系非常乱。– 实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门。– 这就是一个典型的“中介者模式”总经理起到一个中介、协调的作用• 核心:– 如果一个系统原创 2021-01-08 13:05:57 · 70 阅读 · 0 评论 -
设计模式(十六)行为型模式-迭代器模式 iterator
• 场景:– 提供一种可以遍历聚合对象的方式。又称为:游标cursor模式– 聚合对象:存储数据– 迭代器:遍历数据• 结构:– 聚合对象:存储数据– 迭代器:遍历数据• 基本案例:– 实现正向遍历的迭代器– 实现逆向遍历的迭代器• 开发中常见的场景:– JDK内置的迭代器(List/Set)...原创 2021-01-08 12:54:10 · 70 阅读 · 0 评论 -
设计模式(十五)行为型模式-责任链模式chain of responsibility
• 定义:— 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。• 场景:– 打牌时,轮流出牌– 接力赛跑– 大学中,奖学金审批– 公司中,公文审批• 具体场景举例:– 公司里面,报销个单据需要经过流程:• 申请人填单申请,申请给经理• 小于1000,经理审查。• 超过1000,交给总经理审批。• 总经理审批通过– 公司里面,请假条的审批过程:• 如原创 2021-01-08 12:50:08 · 113 阅读 · 0 评论 -
设计模式(十四)结构型模式-总结
• 结构型模式:– 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。– 分类:• 适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式。• 结构型模式汇总代理模式 为真实对象提供一个代理,从而控制对真实对象的访问 适配模式 使原本由于接口不兼容不能一起工作的类可以一起工作 桥接模式 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。 组合模式原创 2021-01-08 11:59:41 · 80 阅读 · 0 评论 -
设计模式(十三)结构型模式-享元模式FlyWeight
• 场景:– 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。• 核心:– 享元模式以共享的方式高效地支持大量细粒度对象的重用。– 享元对象能做到共享的关键是区分了内部状态和外部状态。• 内部状态:可以共享,不会随环境变化而改变• 外部状态:不可以共享,会随环境变化而改变• 围棋软件设计– 每个围棋棋子都是一个对象,有如下属性:颜色、形状、大小(这些是可以共享的) 称之为:内部状态位置 (这些不可以共享) 称之为:外部原创 2021-01-08 11:46:10 · 67 阅读 · 0 评论 -
设计模式(十二)结构型模式-外观模式facade
• 迪米特法则(最少知识原则):– 一个软件实体应当尽可能少的与其他实体发生相互作用。• 外观模式核心:– 为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。• 基本案例– 注册公司流程(不使用外观模式)– 注册公司流程(使用外观模式)• 开发中常见的场景– 频率很高。哪里都会遇到。各种技术和框架中,都有外观模式的使用。如:• JDBC封装后的,commons提供的DBUtils类,Hibernate提供的工具类、Spring JDBC工具类原创 2021-01-08 11:34:58 · 72 阅读 · 0 评论 -
设计模式(十一)结构型模式-装饰模式decorator
•职责:— 动态的为一个对象增加新的功能。— 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能拓展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。• 实现细节:– Component抽象构件角色:• 真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。– ConcreteComponent 具体构件角色(真实对象):• io流中的FileInputStream、FileOutputStream原创 2021-01-08 11:28:27 · 67 阅读 · 0 评论 -
设计模式(十)结构型模式-组合模式composite
• 使用组合模式的场景:– 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。• 组合模式核心:– 抽象构件(Component)角色: 定义了叶子和容器构件的共同点– 叶子(Leaf)构件角色:无子节点– 容器(Composite)构件角色: 有容器特征,可以包含子节点• 组合模式工作流程分析:– 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子。– 当容器原创 2021-01-07 18:30:15 · 76 阅读 · 0 评论 -
设计模式(九)结构型模式-桥接模式bridge
• 场景分析– 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?– 这个场景中有两个变化的维度:电脑类型、电脑品牌。• 桥接模式核心要点:– 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。• 桥接模式总结:– 桥接模式可以取代多层继承的方案。 多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。– 桥接模式极大的..原创 2021-01-07 18:23:47 · 82 阅读 · 0 评论 -
设计模式(八)结构型模式-代理模式 Proxy pattern
• 代理模式(Proxy pattern):– 核心作用:• 通过代理,控制对对象的访问!可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即:AOP的微观实现!)从而实现将统一流程代码放到代理类中处理– AOP(Aspect Oriented Programming面向切面编程)的核心实现机制!– 核心角色:• 抽象角色– 定义代理角色和真实角色的公共对外方法• 真实角色– 实现抽象角色,定义真实角色所要实现的业务逻原创 2021-01-07 18:07:02 · 94 阅读 · 0 评论 -
设计模式(七)结构型模式-适配器模式adapter
• 生活中的场景• 什么是适配器模式?– 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。• 模式中的角色– 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。– 需要适配的类(Adaptee):需要适配的类或适配者类。– 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。• 下面的场景,如何解决?• 适配器模式解决方案:原创 2021-01-07 17:47:40 · 66 阅读 · 0 评论 -
设计模式(六)创建型模式-总结
• 创建型模式:都是用来帮助我们创建对象的!– 单例模式• 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。– 工厂模式• 简单工厂模式– 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)• 工厂方法模式– 用来生产同一等级结构中的固定产品。(支持增加任意产品)• 抽象工厂模式– 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)– 建造者模式• 分离了对象子组件的单独构造(由Builder来负责)和装原创 2021-01-07 17:05:40 · 61 阅读 · 0 评论 -
设计模式(五)创建型模式-原型模式prototype
• 场景– 思考一下:克隆技术是怎么样的过程? 克隆羊多利大家还记得吗?– javascript语言中的,继承怎么实现?那里面也有prototype,大家还记得吗?• 原型模式– 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。– 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点– 优势有:效率高(直接克隆,避免了重新执行构造过程步骤) 。– 克隆类似于new,但是不同于new。new创建新的对象属性采用的是原创 2021-01-07 16:59:58 · 141 阅读 · 0 评论 -
设计模式(四)创建型模式-建造者模式
• 场景– 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:• 装配这些子组件是不是有个步骤问题?– 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。• 建造模式的本质– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的原创 2021-01-07 16:50:12 · 66 阅读 · 0 评论 -
设计模式(三)创建型模式-工厂模式
• 工厂模式– 实现了创建者和调用者的分离。– 详细分类:• 简单工厂模式• 工厂方法模式• 抽象工厂模式• 面向对象设计的基本原则– OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。– DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。– LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。• 核心原创 2021-01-07 16:43:27 · 162 阅读 · 0 评论 -
设计模式(二)创建型模式-单例模式
• 核心作用– 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。• 常见应用场景:– Windows的Task Manager(任务管理器)就是很典型的单例模式– windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。– 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。– 网站的计数器,一般也是采用单例模式实现,否则难以同步。– 应用程序的日志应用原创 2021-01-04 11:12:23 · 79 阅读 · 0 评论 -
设计模式(一)GOF23 23种设计模式
• 创建型模式:– 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。• 结构型模式:– 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。• 行为型模式:– 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。...原创 2021-01-04 11:05:19 · 66 阅读 · 0 评论