前言 在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。 本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(9)享元模式》文章中,我们介绍了享元模式。 本文是这个系列的第十篇章,我们将讲解一下代理模式的实现方式、应用场景以及它的用途。 代理模式 在代理模式中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。 代理模式又有两种主要形式: 静态代理:在编译时就已经确定了代理类和被代理类之间的关系,通常需要为每个被代理类都编写一个对应的代理类,并实现相同的接口。 动态代理可以使用Java原生API或者第三方框架来实现,如JDK Proxy、CGLIB、等。
组合模式属于对象的结构模式,有时又叫做“部分——整体”模式。 组合模式将对象组织到树结构中,可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。 二、组合模式-安全式 1、基础概念 安全式的组合模式要求管理聚集的方法只出现在树枝构件类中,而不出现在树叶构件类中。 在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。 树叶构件(Leaf)角色 树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。 -透明式 1、概念图解 与安全式的组合模式不同的是,透明式的组合模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定接口。
装饰器模式 装饰器模式的定义: 动态的给一个对象添加额外的职责,就功能来说,装饰模式相比子类更为灵活 装饰器模式的四个角色: Componment 抽象构建角色:该角色用于规范需要装饰的对象 ConcreateComponment 该角色是需要被装饰地 对象 Decorator: 装饰角色:一般是一个抽象类,该角色持有私有的一个抽象构件对象 ConcreateDecorator: 具体装饰角色;感觉主要负责对构件对象进行装饰 装饰器模式的简单示例 componment); componment = new ConcreateDecorator(componment); componment.doingProcedureA(); } } 装饰器模式的优点和使用范围 装饰器模式的优点: 装饰类和被装饰类可以独立发展,而不会相互耦合 装饰模式是继承关系的一种替代方案 装饰模式可以动态的扩展一个实现类的功能 装饰器模式的应用场景: 用于扩展一个类的功能,或者给一个类添加附加职责 动态的给一个对象天机功能,这些功能可以被动态的撤销 需要位一批的兄弟类进行改装或加装功能 装饰器模式的缺点: 多层的装饰较为复杂
工厂模式: 这里用百度百科的词条来解释: 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象。 在我们java生态中,spring对工厂模式运用的可算是极致了,顶级类BeanFactory是bean的最顶级的工厂类... 在这里,我模拟一下工厂模式: 先说一下工厂模式需要的角色: 机器? 试想,天下的面条种类那么多,工厂模式是非常容易扩展的,实现思路即java的“多态” 这里,就已经实现了一个简单的工厂模式,即简单工厂模式 当你的宝马机器生产宝马的时候,这个时候只需要拓展Machine类即可 machine = new BMWMachine(); System.out.println(machine.create(new Object())); } 这就是java
张三想要去日本某公司买xxx,但是对于经费等等一系列的原因然后就放弃了这个念头,我刚好要去日本玩的,张三得知我要去日本,他就偷偷给我说,他想要一个size为D的xxx,让我帮他代购一个,于是我就带着他的需求去日本某公司购入了xxx,然后买完之后回国拿给了张三。 在这个过程中,我作为代理对象(我带着张三的需求【购买的动作即为接口,他的需求即为方法和参数】),张三作为被代理对象。我帮他购买这个过程就叫做代理。 又有一个环境,即当张三的老婆也需要女性的xxx,也偷偷的让我代购,那么我又要亲自过去帮她买,但是想想,我作为一个d代理,一会儿帮这个买,一会儿帮那个买,每次买的东西还不一样,想想,如果作为代码写成一个系统代码是不是会非常的多?
1.定义 组合模式是一种结构型模型,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 上回说到刘备被设计入赘江东后,通过诸葛孔明的锦囊妙计成功化险为夷。回到荆州后刘备一心想匡扶汉室,于是准备继续招兵买马。 如此看来这种层次结构不就是我们说的组合模式要实现的内容吗? 相似的对象当成单一对象,部门和人员都具备组织树的特性即部门下可能是人员也有可能存在子部门信息。同时都具备基础信息,比如名字等。 2.组合模式实现 OrganizationalStructure抽象类表示组织结构,其中由于部门和人员信息都属于组织结构具有相似,所以部门和人员信息都是他的子类。 参考文献《图解设计模式》 代码获取地址:https://gitee.com/bughong/design-pattern
参考: design-patterns.readthedocs |观察者模式 refactoringguru | 观察者模式 博客园 | 简说设计模式——观察者模式 CSDN | 设计模式 ( 十五 ) 缺点: 如果观察者和目标存在循环订阅,可能导致系统崩溃 观察者只能知道目标变换了,不知道目标怎么变化的 如果观察者和目标之间存在多个观察者,这样消息传递会很费时 通知顺序可能是随机的 Java对观察者模式的支持 Java util包中提供了 Observer接口和Observable类,前者就是观察者接口,后者相当于目标 Subject,实现具体目标时可以继承该类。 public void release(){ this.setChanged(); this.notifyObservers(); } } import java.util.Observable ; import java.util.Observer; public class Customer implements Observer { @Override public void
” 责任链模式优点显而易见,降低了请求对象与处理对像之间的耦合度,处理对象易于扩展,增强了指派处理对象的灵活性。 责任链简化了对象之间的连接。 链式结构 责任链模式主要由3个要素组成: 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。 关于对责任链模式的看法 那么我们什么时候合适使用责任链模式呢? 一般如果由多个对象处理一个请求,需要使用哪对象由实际调用的时候确定。这种场景我们就可以使用调用者模式。 大家可以思考下这方面能不能使用责任链模式呢。 还有在订单系统中,订单状态的处理是否可以使用此种设计模式更为优秀呢。 所以使用责任链模式需要控制链路长度。比如在Handler中设置最大节点数量。如果节点数量超出这个最大数量,就不允许该链路的创立。
导言 在面向对象的软件设计中,如果一个系统有比较复杂的数据结构,客户程序往往没有必要详细地知道其内部的实现。为了使用方便,该系统应该提供给客户程序一种遍历方法。 本节介绍如何给复杂的聚合型数据结构提供一个遍历方法的设计模式——迭代器模式(Iterator Pattern)。 迭代器模式能够提供一种方法按照顺序访问一个聚合对象中的所有元素,而又不需要暴露该对象的内部表示。 迭代器模式的结构图如图所示。 ? 迭代器模式的各组成部分及含义说明如下。 ConcreteAggregate:封装了一个数据存储结构,实现一个具体的集合,如列表、Java 类型 ArrayList 等。 class ConcreteAggregate(Aggregate): def __init__(self): self.data_structure = list(range(10
策略模式 基本介绍 1)策略模式(StrategyPattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2)这算法体现了几个设计原则, 说明:从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定 策略模式优化IF else 类图 使用策略模式+工厂+模板方法 解决多分类查询 本来我想在其中加入状态模式, 用于控制是根据一些参数, 来决定查询DB还是查询缓存, 但是后来应为一些场景是缓存实现不了的, 只能查DB了, 但是一些公用数据还是查询缓存的, 后续如果需要扩展其他查询, PressureVo> addIsOnline(List<Pressure> records, List<String> deptCodes) { // 业务逻辑 } } 策略模式的注意事项和细节 1)策略模式的关键是:分析项目中变化部分与不变部分 2)策略模式的核心思想是:多用组合/聚合少用继承;用行为类组合,而不是行为的继承。
这篇推文学习创建型模式最后一种-原型模式,该模式的思想是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象,以便使用 首先需要了解对象深、浅复制的概念: 浅拷贝:将一个对象复制后,基本数据类型的变量都会重新创建 所有的Java类都继承至Object,而Object类提供了一个clone()方法,该方法可以将一个java对象复制一份,因此在java中可以直接使用clone()方法来复制一个对象。 异常 Java中任何实现了Cloneable接口的类都可以通过调用clone()方法来复制一份自身然后传给调用者。 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。 相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。
设计模式 一、单例模式 定义:单例模式,保证一个类有且仅有一个实例,并提供一个它的全局访问点。 缺点:不管用到与否,类装载时就完成实例化(如果没有用到,则内存浪费)。 这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。 这种设计模式可以用于解耦。 装饰者模式 定义:装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。 装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。 装饰模式的核心在于抽象装饰类的设计。
设计模式基础 设计模式主要基于的面向对象设计的原则: 程序到一个接口不用实现; 有利于对继承对象组合; 设计模式用途: 开发人员的通用平台; 最佳实践; 类型: 创造模式:提供了一种创建对象而隐藏创建逻辑的方法 ,而非直接使用new来实例化对象; 结构模式:涉及类和对象组成,继承概念用于组成接口并定义方法组合对象以获得新功能; 行为模式:侧重于对象之间的通信; J2EE 模式:设计表示层,由Sun Java Center ,可直接访问而不需要实例化类对象; 原型模式 涉及实现一个原型接口,只创建当前对象的克隆; Builder模式 构造器逐步构建最终对象,此构造器独立于其他对象; 结构设计模式 适配器(Adapter)模式 ,用于减少层代码中的业务层代码的通信或远程查找功能,业务层中实体如下: 客户端:表示层代码可以是 JSP,servlet 或 UI java 代码; 业务代理:为客户端实体提供对业务服务方法的访问的单入口点类 ,且无需检查空值; MVC 模式 模型:表示携带数据对象或JAVA POJO,若其数据改变也可以具有逻辑来更新控制器; 视图:表示模型包含的数据的可视化层; 控制器:对模型和视图都起作用,控制数据流进入模型对象
简介 java中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握。 总体来说设计模式分为三大类: 创建型模式: 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 单列模式 所谓的单例设计指的是一个类只允许产生一个实例化对象;最好理解的一种设计模式,分为懒汉式和饿汉式。 工厂设计模式 工厂模式分为工厂方法模式和抽象工厂模式。 工厂方法模式 工厂方法模式分为三种:普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。
本文链接:https://blog.csdn.net/github_39655029/article/details/82736019 设计模式基础 设计模式主要基于的面向对象设计的原则: 结构模式:涉及类和对象组成,继承概念用于组成接口并定义方法组合对象以获得新功能; 行为模式:侧重于对象之间的通信; J2EE模式:设计表示层,由Sun Java Center标识; 创造设计模式 ,可直接访问而不需要实例化类对象; 原型模式 涉及实现一个原型接口,只创建当前对象的克隆; Builder模式 构造器逐步构建最终对象,此构造器独立于其他对象; 结构设计模式 适配器 :表示层代码可以是JSP,servlet或UI java代码; 业务代理:为客户端实体提供对业务服务方法的访问的单入口点类; 查找服务:负责获得相关业务的实施和提供业务的委托对象业务对性爱难过的访问; NULL对象类,不提供此类的任何实现,且无需检查空值; MVC模式 模型:表示携带数据对象或JAVA POJO,若其数据改变也可以具有逻辑来更新控制器; 视图:表示模型包含的数据的可视化层; 控制器
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 三、Java中具体的设计模式 1.简单工厂模式(Simple Factory) 根据提供给它的参数,返回的是几个可能产品中的一个类的实例。 ? 在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结 设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类。 分别是创建型模式、结构型模式和行为型模式 列举几种设计原则,这几种设计原则将贯通全文: 面向接口编程,而不是面向实现。 下面来看看一个例子,先把装饰模式弄清楚,然后再介绍下 java io 中的装饰模式的应用。 这是一个简单的设计模式,我们直接上代码再说吧。 总结 学习设计模式的目的是为了让我们的代码更加的优雅、易维护、易扩展。这次整理这篇文章,让我重新审视了一下各个设计模式,对我自己而言收获还是挺大的。
Java设计模式 今天一直在思考一个让我疑惑的问题,在用 SpringBoot 进行项目开发的时候,有这样一个场景,比如说家具和物料是两个不同的模块,有一个调用的是我们小米数字门店通用的接口,代码的实现逻辑都是一致的
策略模式(Strategy Pattern) 现在来地说说如何来实现策略模式(锦囊妙计): 1、策略[妙计]实现接口(IStrategy); 2、对应的策略实现类(*Strategy); 3、封装策略的锦囊 IStrategy.java /* *策略实现的接口 */ public interface IStrategy{ //策略执行方法 public void operate(); } FirstStrategy.java public void operate(){ system.out.printf("this is the first strategy"); } } SecondStrategy.java public void operate(){ system.out.printf("this is the second strategy"); } } ThirdStrategy.java } public void doOperate(){ this.iStrategy.operate(); } } 锦囊已经有了,现在就是缺少使用的人了(也就是执行者) StrategyExecute.java
状态模式: 允许一个对象在其内部状态改变时改变其行为, 其对象看起来像是改变了其类. (图片来源: 设计模式:可复用面向对象软件的基础) 其目的是: 解决系统中复杂对象的状态流转以及不同状态下的行为封装问题. 模式实现 案例: 问题跟踪(Bug状态流转): 有过Kelude、Jira使用经验的同学都知道一个Bug由测试同学提出, 一直到被开发同学解决会经过一系列状态的流转: 新建(New) -> 打开(Open ) -> 解决(Fixed) -> 关闭(Closed) … 且每种状态都会对应复杂业务的处理逻辑(如通知相应开发/测试人员、邮件/短信提醒、报表记录等等), 下面我们就以这个场景来讨论状态模式的实现 context.setCurrent(new OpenState()); } context.request(); } } 另外还有一种基于表驱动的状态机实现, 实现细节参考 设计模式