
设计模式
文章平均质量分 97
设计模式
哪 吒
2022博客之星Top1,现象级专栏 《Java基础教程系列》作者,专注Java硬核干货分享,立志做到Java赛道全网Top N
展开
-
设计模式23模式介绍
设计模式精品专栏。原创 2020-01-18 08:20:52 · 140061 阅读 · 19 评论 -
单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特、合成复用
一、单一职责原则1、目的降低代码复杂度、降低系统耦合度、提高可读性2、定义对于一个类,只有一个引起该类变化的原因;该类的职责是唯一的,且这个职责是唯一引起其他类变化的原因。3、解决将不同的职责封装到不同的类或者模块中,当有新的需求将现有的职责分为颗粒度更小的职责的时候,应该及时对现有代码进行重构。4、注意事项和细节(1)降低类的复杂度,一个类只负责一项职责;(2)提高类的可读性,可维护性;(3)降低变更引起的风险;(4)通常情况下,我们应当遵守单一职责原则,只有逻原创 2020-06-01 16:44:25 · 7801 阅读 · 5 评论 -
【源码分析设计模式 1】JDK中的单例模式
一、基本介绍单例模式比较简单,可以说没有复杂的调用和接口的设计,就是一个简单的类,只是要求这个类只生成一个对象,无论什么时候都要保证这一点,因此只能生成一个实例的模式就是单例模式。单例模式要素1、私有构造方法;2、私有静态引用指向自己实例 ;3、以自己实例为返回值的公有静态方法;二、类的加载类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式加载类,也可以是懒汉式加载,这跟不同的JVM实现有关。加载完类后,类的初始化就会发生,如果是对一个类的主动使用就会初始化原创 2020-06-06 12:51:07 · 15246 阅读 · 15 评论 -
【源码分析设计模式 2】JDK中的抽象工厂模式
一、基本介绍1、为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构;2、抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品;3、使用抽象工厂模式一般要满足以下条件:系统中有多个产品族, 每个具体工厂创建同族但属于不同等级的产品; 系统一次只可能消费其中某一族产品,即同族的产品一起使用。二、抽象工厂模式的结构抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工原创 2020-06-04 00:07:12 · 9052 阅读 · 0 评论 -
【源码分析设计模式 3】JDK中的工厂模式
一、前言工厂二字想必大家都不陌生,工厂就是用来建造东西的,我们市面上买的东西比如水杯、玩具、汽车等等都是从工厂生产的,那我们需不需要知道它们是如何生产出来的呢?当然不需要,商家从工厂中直接提货,我们就可以购买了,完全不知道它是如何生产的,这就是工厂方法模式。工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到...原创 2020-03-25 09:44:33 · 9907 阅读 · 5 评论 -
【源码分析设计模式 4】JDK中的原型模式
一、基本介绍1、原型模式是指,用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。2、原型模式是一种创建型设计模式,允许一个对象再创建另外一个可复制的对象,无需知道如何创建的细节。3、...原创 2020-06-04 15:28:59 · 6419 阅读 · 4 评论 -
【源码分析设计模式 5】Java I/O系统中的装饰器模式
一、基本介绍动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。二、装饰器模式的结构1、Component,抽象构件Component是一个接口或者抽象类,是定义我们最核心的对象,也可以说是最原始的对象,比如街边小吃;2、ConcreteComponent,具体构件,或者基础构件ConcreteComponent是最核心、最原始、最基本的接口或抽象类Component的实现,可以单独用,也可将其进行装饰,比如街边小吃最有名的手抓饼;3、Decorat原创 2020-06-08 12:34:40 · 8835 阅读 · 4 评论 -
【源码分析设计模式 6】Mybatis中的组合模式
一、基本介绍组合模式,将对象组合成树形结构以表示“整体-部分”的层次结构,一种对象结构型模式。由于在软件开发中存在大量的树形结构,因此组合模式是一种使用频率较高的结构型设计模式,Java SE中的AWT和Swing包的设计就基于组合模式。除此以外,在XML解析、组织结构树处理、文件系统设计等领域,组合模式都得到了广泛应用。组合模式的分类:1、透明组合模式透明组合模式中,抽象构件角色中声明了所有对于管理成员对象的方法,透明组合模式是组合模式的标准形式。2、安全组合模式安全组合模式中原创 2020-06-08 15:01:55 · 5778 阅读 · 0 评论 -
【源码分析设计模式 7】Integer中的享元模式
一、基本概念说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象“Flyweight”,下次再创建相同的字符串“Flyweight”时,只要把它的引用指向“Flyweight”,这样就实现了“Flyweight”字符串在内存中的共享。举个最简单的例子,网络联机下棋的时候,一台服务器连接了多个客户原创 2020-06-09 14:33:05 · 5932 阅读 · 0 评论 -
【源码分析设计模式 8】mybatis中的代理模式
一、基本概念代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是中介。想象一下我们生活中购买火车票的情节,我们可以通过飞猪购买,也可以到窗口购买,飞猪就相当于代理模式,秒懂吧?二、代理模式的结构代理是英文proxy翻译过来的,我们生活中最常见的代理,代购,不需解释,都懂。上图就是代理模式的UML类图。1、用户只关心接口功能,而不在乎是谁提供了功能,上图中接口subject;2、接口真正实现者是RealSubject,但是它不与用户直原创 2020-06-10 16:59:44 · 7393 阅读 · 1 评论 -
【源码分析设计模式 9】SpringIOC中的模板方法模式
一、基本介绍模板方法模式,在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,就是定义一个操作的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重新定义该算法的某些步骤。二、模板方法模式的结构AbstractClass:实现一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。AbstractClass其实就是一个抽象模板,定义并实现了一个模板方法原创 2020-06-10 23:38:02 · 4557 阅读 · 2 评论 -
【源码分析设计模式 10】SpringMVC中的适配器模式
一、基本介绍适配器这个词我们应该很熟悉,天天都在使用,手机充电时,电源线头头就叫电源适配器,干什么用的呢?把220V电压转换成手机充电时使用的电压,那么适配器是不是很好理解了,下面看一下定义。Adapter适配器模式,将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。适配器模式有“类适配器”和“对象适配器”两种不同的形式。二、适配器模式的结构1、目标(Target)定义一个客户端使用的特定接口。2、客户端(Client)使用原创 2020-06-06 11:25:07 · 9169 阅读 · 4 评论 -
【源码分析设计模式 11】SpringMVC中的策略模式
一、前言什么是策略模式?策略这个词应该怎么理解呢,打个比方说,我们出门的时候选择不同的出行方式,比如步行、骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。再比如我们去逛商场,商场现在正在搞活动,有打折的、满减的、返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身就是一种策略,并且这些算法是随时可能互相替换的,比如针对同一件商品,今天打...原创 2020-01-19 14:05:04 · 9332 阅读 · 0 评论 -
【源码分析设计模式 12】JDBC中的桥接模式
一、基本介绍将实现与抽象放在两个不同的层次中,使两个层次可以独立改变。桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同的类承担不同的职责。它的主要特点是把抽象与行为实现分离开,从而可以保持各部分的独立性以及功能扩展。二、桥接模式的结构其中,Abstraction为抽象化角色,定义出该角色的行为,同时保存一个对实现化角色的引用;Implementor是实现化角色,它是接口或者抽象类,定义角色必需的行为和属性;RefinedAbstraction为修正抽象化角色,引用.原创 2020-06-11 14:58:48 · 6723 阅读 · 0 评论 -
【源码分析设计模式 13】命令模式
一、基本介绍1、在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计。2、命令模式使请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。3、在命令模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求,同时命令模式也支持撤销操作。二、命令模式的结构1、Invoker:调用者角色2、Command:命令角色原创 2020-06-12 16:55:11 · 5921 阅读 · 4 评论 -
浅谈Visitor访问者模式
一、前言什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么我们平常是怎么访问的呢,基本上就是直接拿着需要访问的地址来读写内存就可以了。为什么还要有一个访问者模式呢,这就要放到OOP之中了,在面向对象编程的思想中,我们使用类来组织属性,以及对属性的操作,那么我们理所当然的...原创 2019-10-16 12:00:00 · 5189 阅读 · 0 评论 -
浅谈Facade外观模式
一、 基本概念有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。 其实本篇要说的这个设计模式就...原创 2019-10-16 15:02:00 · 4964 阅读 · 0 评论 -
浅谈Observer观察者模式
一、前言观察者模式其实最好的名称应该是“发布订阅”模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习了仲裁者模式,其中当控件的状态发生改变的时候就会向仲裁者发出信息,让仲裁者进行仲裁,这其实和发布订阅非常的类似,但是用处是不一样的,仲裁者模式是用来解除复杂对象之间的相互调用的关系,从而独立出来进行开发,而观察者模式是在被观察者状态改变的时候被动的...原创 2019-10-24 14:48:00 · 5854 阅读 · 1 评论 -
浅谈Mediator仲裁者模式
一、前言Mediator模式又称为仲裁者模式或中介者模式,所起的作用就是仲裁和中介,帮助其它类之间进行交流。在仲裁者模式之中,我们要明确两个概念,那就是仲裁者(Mediator)和组员(Colleague),不管组员有什么事情,都会向仲裁者汇报,仲裁者会根据全局的实际情况向其他Colleague作出指示,共同完成一定的逻辑功能。二、代码Mediator接口:(仲裁者接口)p...原创 2019-10-25 12:52:00 · 4804 阅读 · 0 评论 -
浅谈Interpreter解释器模式
一、前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器、语法分析器、语义分析器、中间代码优化器以及最终的最终代码生成器。而这个解释器其实就是完成了对语法的解析,将一个个的词组解释成了一个个语法范畴,之后拿来使用而已。 为什么会有这个解释器模式呢,我想这是从编译原理中受到启发...原创 2019-10-25 13:48:00 · 3870 阅读 · 0 评论 -
浅谈Memento备忘录模式
一、前言 备忘录模式用于保存和恢复对象的状态,相信大家看过我前面的拙作就会想到原型模式也能保存一个对象在某一个时刻的状态,那么两者有何不同的呢?原型模式保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例;而备忘录模式保存的是我们关心的在恢复时需要的对象的部分状态信息,相当于快照。备忘录模式大家肯定都见过,比如在玩游戏的时候有一个保存当前闯关的状态的功能,会对...原创 2019-10-25 13:28:00 · 3882 阅读 · 0 评论 -
浅谈State状态模式
一、前言 状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过《编译原理》就会明白DFA M和NFA M,在确定有限状态机和非确定有限状态机中,状态就是最小的单元,当满足某种条件的时候,状态就会发生改变,我们可以把时间中的一个时刻当做一个状态,那么其实整个社会都是有状态组成的,前一时刻到下一时刻,整个社会上的物质(空间)发生了什么样的变化,因此状态可以非常的大也可以非常的小...原创 2019-10-25 15:07:00 · 5490 阅读 · 1 评论 -
浅谈(chain of responsibility)责任链模式
一、前言责任链(chain of responsibility)模式很像异常的捕获和处理,当一个问题发生的时候,当前对象看一下自己是否能够处理,不能的话将问题抛给自己的上级去处理,但是要注意这里的上级不一定指的是继承关系的父类,这点和异常的处理是不一样的。所以可以这样说,当问题不能解决的时候,将问题交给另一个对象去处理,就这样一直传递下去直至当前对象找不到下线了,处理结束。如下图所示,处于同...原创 2019-10-25 15:34:00 · 9418 阅读 · 0 评论 -
浅谈Iterator迭代器模式
一、前言设计模式有很多,最典型的是GoF的23种设计模式,听起来很多,其实大部分我们都是见过的,按照常见度来分,最常用的差不多是六七个吧,因此,我们在学习的时候应该有轻重缓急之分,不能一视同仁,而应该抓住重点,将一些最常用的设计模式吃透了,那么我们在遇到一个实际问题的时候就能根据问题的需要来进行相应的取舍。学习是一个循环往复的过程,没有学过一次不再接触就能掌握的,一定要反复的记忆,反复的练习...原创 2019-09-19 10:05:00 · 4291 阅读 · 4 评论