Java设计模式
传说中的靖哥哥
小小程序员一枚
展开
-
Java设计模式(25):责任链模式(职责链模式)
25,责任链模式25.1,问题引入_采购需求采购员需要采购一批教学器材,对器材采购金额有分级审批权限如果金额小于等于3000元,由教学主任审批(0 < x <= 3000)如果金额小于等于10000元,由院长审批(3000 < x <= 10000)如果金额大于10000元,由校长审批(x > 10000)在传递方案中,拿到采购金额后,根据金额不同,推送到不同的处理人进行处理客户端需要进行更多的逻辑分支处理,调用不同的审批人进行审批如果各个级别的审批金原创 2020-12-22 09:29:15 · 334 阅读 · 1 评论 -
Java设计模式(24):策略模式
24,策略模式(Strategy)24.1,问题引入_鸭子问题有各种鸭子(如:北京鸭,野鸭,玩具鸭),鸭子存在各种行为(如:叫,游泳,飞行等)。需要做一个程序,显示鸭子的各种信息在传统方案中,通过定义一个抽象的 Duck 类,用具体鸭子类继承该类,进行相对应的行为实现首先:通过继承,会让所有具体鸭子类有共同是行为方式,这是明显不合适的其次:通过方法重写,为不同的鸭子实现不同的实现方式,这样需要覆盖所有的实现方法可以通过策略模式进行解决24.2,基本介绍策略模式(Strategy Pat原创 2020-12-22 09:29:11 · 276 阅读 · 1 评论 -
Java设计模式(23):状态模式
23,状态模式23.1,问题引入_APP抽奖活动提供一种抽奖活动,每一次抽奖扣除用户50积分,且中奖概率为10%,奖品数量固定,送完为止活动存在四种状态:不能抽奖:未进行积分兑换可以抽奖:已经进行积分兑换。抽奖完成后,如果未中奖,转到不能抽奖;如果中奖,转到发放奖品发放奖品:对中奖用户发放奖品。奖品发送后,如果还有剩余奖品,转到不能抽奖;如果奖品已经送完,转到奖品领完奖品领完:奖品全部领完这种需求可以通过状态模式完成23.2,基本介绍状态模式(State Pattern):主原创 2020-12-22 09:29:07 · 379 阅读 · 1 评论 -
Java设计模式(22):解释器模式
22,解释器模式(Interpreter)22.1,问题引入_计算器问题在界面输入计算表达式,如:a+b+c+d,然后针对每一个元素输入具体值并保存,对该表达式进行填充求值,得到结果在固有表达式中,如果需要加入新的运算符,如* / ()等,可能会造成功能扩展困难此时可以考虑引入解释器模式,对运算符等进行隔离,对每一种类型进行单独的解释计算22.2,基本介绍在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再根据语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这原创 2020-12-22 09:29:00 · 200 阅读 · 1 评论 -
Java设计模式(21):备忘录模式
21,备忘录模式(Memento)21.1,问题引入_游戏角色恢复问题游戏角色有攻击力和防御力,在大战BOSS前保存自身的状态,当大战BOSS后攻击力和防御力下降,从备忘录中恢复初始状态在传统方式中,new对象简单做备份,再需要恢复数据时,从新对象中取初始数据进行覆盖,这样会暴露对象的内部实现细节这时候可以通过备忘录模式实现21.2,基本介绍备忘录模式(Memento Pattern):行为型模式;在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于在后续对该原创 2020-12-19 14:20:21 · 118 阅读 · 1 评论 -
Java设计模式(20):中介者模式
20,中介者模式(Mediator)20.1,问题引入_租房中介在一个租房者去市场上租房的时候,面临的是众多的被租房子,及每一套房子后面的房东首先,租房者需要跟每一个房东打交道,去确认房子,去议价其次,房东间可能也会存在沟通,形成一张沟通网在整个沟通过程中,各方都会很累,没有效率,此时需要一个承上启下的角色存在,就是租房中介这就可以用中介者模式进行处理20.2,基本介绍中介者模式(Mediator Pattern):是行为模式的一种。用一个中介对象,封装一系列的对象交互(发送东)。中介原创 2020-12-19 14:17:34 · 252 阅读 · 2 评论 -
Java设计模式(19):观察者模式
19,观察者模式(Observer)19.1,问题引入_天气预报问题气象站可以将每天测量到的温度、湿度、气压等发布出去,发布到自己的页面或者第三方系统发布的形式可以采用两种方式:修改数据等待获取和直接数据推送在进行数据推送时,需要明确对端系统,然后在变更时调用对端接口进行数据修改对端系统肯定是不确定多个,并且随时可能存在增减,如何对多系统进行管理,并进行数据推送,可以使用观察者模式19.2,基本介绍观察者模式(Observer Pattern):是解决对象间关系一对多依赖的一种设计方案。原创 2020-12-19 14:15:44 · 132 阅读 · 1 评论 -
Java设计模式(18):迭代器模式
18,迭代器模式(Iterator)18.1,问题引入_学校体系结构在 组合模式 中引入了学校体系结构,并通过 List 集合对各个层级进行定义,可以很方便的对整个结构进行遍历但是如果各个层级的下属部门集合不一定都是用 List 集合定义,而是通过 Set,array 或者其他自定义方式进行存储,那就没有一个统一的方式进行结构遍历此时可以引入迭代器模式进行统一18.2,基本介绍迭代器模式(Iterator Pattern)是一种常用的设计模式,属于行为型模式如果我们的集合是通过不同的方式原创 2020-12-19 14:13:57 · 140 阅读 · 1 评论 -
Java设计模式(17):访问者模式
17,访问者模式(Visitor)17.1,问题引入_账本查看财务系统是存在财务账本,财务账本有很多分类,而其中大体可以分为两种:支出和收入查看账本的人也分为好几种:老板,注会等等,每一个人查看账本的目的也是不相同的这时候对有多个固定元素的账本和多个角色的访问者,可以考虑使用访问者模式17.2,基本介绍访问者模式(Visitor Pattern):封装一些作用于某种数据结构的各元素操作,可以在不改变数据结构的前提下定义作用与这些元素的新的操作主要是将数据结构(元素)与数据操作(访问者)分原创 2020-12-19 14:03:27 · 129 阅读 · 1 评论 -
Java设计模式(16):命令模式
16,命令模式(Command)16.1,问题引入_智能生活项目需求假如有一套智能家电,照明灯、风扇、空调、冰箱、洗衣机等,需要在手机上安装APP进行控制这些智能家电来自不同的厂家,每一个厂家针对设备都有不同的APP,但是我们不想下载那么多的APP,希望通过一个APP进行全控制,如万能遥控要实现一个APP控制所有智能家电的需要,则各个智能家电需要一个统一的接口提供给APP使用,这时候可以考虑命令模式命令模式可以将 动作的请求者 从 动作的执行者 对象中解耦出来在这个例子中:动作的请求者是手机A原创 2020-12-19 14:00:26 · 133 阅读 · 1 评论 -
Java设计模式(15):模板方法模式
15,模板方法模式(TemplateMethod)15.1,基本介绍模板方法模式(Template Method Pattern),在一个抽象类中公开定义执行它的方法的模板。子类中可以按需重写相关方法进行自定义,调用则通过抽象类以多态的形式进行。简单来说,模板方法模式定义了一个算法骨架,将一些步骤的实现延伸到子类中,使得子类可以不改变算法结构,但能重定义算法中的某个步骤15.2,类图定义顶层抽象类:CommonTemplate,在该抽象类中定义算法骨架,对公共的部分进行公共实现,对需要子类原创 2020-12-19 13:57:14 · 148 阅读 · 1 评论 -
Java设计模式(14):代理模式
14,代理模式(Proxy)14.1,代码模式基本介绍代理对象为对象提供一个中介,以控制对这个对象的访问,即通过代理对象去访问目标对象被代理的对象可以是远程对象,开销大的对象或者是需要安全控制的对象代理模式有不同的形式,大体可以分为三种:静态代理,JDK动态代理(接口代理)和CGLIB动态代理(不需要接口)对象被代理后,可以在目标对象现有的基础上,增加额外的功能操作,即对现有目标对象的扩展。如执行前后日志打印,方法鉴权等等,是AOP的基本思想14.2,静态代理14.2.1,基本介绍静态原创 2020-12-19 13:32:41 · 129 阅读 · 1 评论 -
Java设计模式(13):享元模式(蝇量模式)
13,享元模式(FlyWeight)13.1,问题引入13.1.1,展示网站项目需求 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友觉得效果不错,也需要这样的产品展示网站,但是需求有些变化:有客户要求以新闻的形式发布有客户要求以博客的形式发布有客户要求以微信小程序的形式发布13.1.2,传统方式解决网站项目直接将项目复制一份,根据不同客户的需求,进行定制化修改13.1.3,问题分析需要的网站相似度很高,而且都不是高访问量网站,如果分成多个虚拟机进行部署,相当于一原创 2020-12-19 13:32:32 · 130 阅读 · 1 评论 -
Java设计模式(12):外观模式
12,外观模式(Facade)12.1,问题引入_家庭影院组建一个家庭影院,需要准备屏幕,投影仪,灯光。此时看一场电影的大概过程为:放下屏幕,打开投影仪,调暗灯光;等电影看完后,大致过程为:调两灯光,关闭投影仪,收回屏幕。此时如果不进行各种模式统筹管理,在实际操作中,需要通过三个开关对三种设备进行单独控制。如果设备过多,会造成过程混乱,还有可能出现顺序(逻辑)错误这时候可以引入外观模式,通过外观类,进行具体操作流程进行管理,面向客户端只包括打开,关闭等基本操作,提高用户体验12.2,基本介绍原创 2020-12-19 13:32:23 · 135 阅读 · 1 评论 -
Java设计模式(11):组合模式
11,组合模式(Composite)11.1,问题引入_学院系统展示一个学校的体系结构,一个学校有多个学院,一个学院有多个专业11.2,基本介绍组合模式(Composite),又叫部分整体模式,属于结构性模式,创建了对象组的树形结构,将对象组合成树状结构以表示整体—部分的关系组合模式使得用户对单个对象和组合对象的访问具有一致性,即组合模式能让客户以一致的方式处理单个对象和组合对象11.3,类图顶层抽象类:OrgComponent,定义了组合模式中的强一致类型,并提供了基本属性和方原创 2020-12-18 17:32:08 · 136 阅读 · 1 评论 -
Java设计模式(10):装饰者模式
10,装饰者模式(Decorator)10.1,问题引入10.1.1,星巴克咖啡订单项目咖啡种类:Espresso(意大利浓咖啡),LongBlack(美式咖啡),Decaf(无因咖啡)调料:Milk(牛奶),Soy(豆浆),Chocolate(巧克力)要求在增加新的咖啡时能有更好的扩展性,改动方便,维护方便使用OO计算不同种类咖啡的价格:包括咖啡价格和调料价格10.1.2,方式一:穷举类方式Drink:是顶层抽象类,表示饮品,price是咖啡价格, description是对咖啡的原创 2020-12-18 17:30:15 · 183 阅读 · 1 评论 -
Java设计模式(9):桥接模式
9,桥接模式(Bridge)9.1,问题引入_手机类型现在对不同类型不同品牌的手机实现操作编程,如下手机外观类型和对应品牌:则需要编写的代码类图可能如下:带来的问题如下:如果我们需要添加一个手机,则需要在各个类型下添加手机如果我们需要添加一个品牌,则需要在该品牌下添加各个类型的手机这样会造成基本的类爆炸,可以使用桥接模式对实现(手机品牌)和抽象(手机类型)分别进行向上抽取,通过抽象依赖实现的方式增强代码维护性9.2,基本介绍桥接模式是指将实现和抽象放在两个不同原创 2020-12-18 17:23:27 · 187 阅读 · 2 评论 -
Java设计模式(8):适配器模式
8,适配器模式(Adapter)8.1,基本介绍适配器模式是将某个类的接口转换为客户端期望的另一个接口表示,主要目的是兼容性,让原本不能工作的接口经过一次转换适配后可以正常工作适配器属于结构性模式主要可以分为三类:类适配器,对象适配器,接口适配器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oaPgGaj-1608282459295)(E:\gitrepository\study\note\image\designMode\1595824104472.原创 2020-12-18 17:09:07 · 169 阅读 · 1 评论 -
Java设计模式(7):建造者模式
7,建造者模式(Build)7.1,基本介绍建造者模式(Builder Pattern)是一种对象构建模式,可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现过程可以构造出不同的对象建造者模式是一步一步创建一个复杂的对象,它允许用户只通过复杂对象的类型和内容就可以创建它们,用户不需要知道具体的构建细节在JDK中的应用:StringBuilder7.2,四个基本角色Product:产品角色,一个具体的产品类AbstractBuilder:抽象建造者,抽取一个向上的抽象类,定义具体产原创 2020-12-18 17:03:29 · 189 阅读 · 0 评论 -
Java设计模式(6):原型模式
6,原型模式(Prototype)6.1,基本介绍原型模式是通过原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象原型模式是一种创建型设计模式,允许通过一个对象再创建一个可定制的对象,且不用对外暴露创建过程原型模式拷贝对象的方式,分为浅拷贝和深拷贝两种:浅拷贝通过JDK提供的API可直接进行处理,只会改变外部对象的地址,对内部引用对象地址不会改变深拷贝需要通过一些其他途径,如序列化,递归拷贝等,关联对内部引用对象地址进行改变,新对象与原对象不会再有任何联系在Spring中的使原创 2020-12-18 16:57:54 · 159 阅读 · 1 评论 -
Java设计模式(5):工厂模式
5,工厂模式(Factory)工厂模式在逻辑上可以分为三种:简单工厂模式,工厂方法模式和抽象工厂模式。其中简单工厂模式不属于23种设计模式。从实际中理解三种工厂模式,大致可以理解为工厂发展的三个阶段,下面将从一个专营炸鸡,汉堡,可乐的小店说起,可能不是很具体,但就是那么回事5.1,简单工厂模式5.1.1,基本介绍简单工厂模式属于创建者模式,是工厂模式的一种,由一个工厂对象决定建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式简单工厂模式:定义了一个创建对象的类,由这个类来原创 2020-12-18 16:44:50 · 96 阅读 · 1 评论 -
Java设计模式(4):单例模式
4,单例模式(Singleton)4.1,单例模式基本介绍所谓单例模式,就是通过一定的方式保证在系统中,对某一个类只存在一个对象实例,并且该类只提供一个获取该对象的方法(静态方法)单例模式创建方式比较多,目前大致可以分为五类八种,后面为一一分析,其中标红表明不可取方式,分别如下:饿汉式:静态常量,静态代码块懒汉式:线程不安全方式,同步方法,同步代码块双重检查方式(推荐)静态内部类方式(推荐)枚举方式(推荐)4.2,饿汉式_静态常量&静态代码块4.2.1,代码示例原创 2020-12-18 16:12:42 · 98 阅读 · 1 评论 -
Java设计模式(2):UML类图
2,UML类图2.1,类关系(Dependency)依赖,泛华(继承),实现,关联,聚合和组合2.2,依赖关系依赖关系介绍成员变量可以作为类依赖关系返回值可以作为类依赖关系方法参数传递可以作为类依赖关系局部变量定义可以作为类依赖关系凡是在该类中出现的其他类,都可以作为该类的依赖类依赖类是关联关系最弱的关系,只要在类中有出现其他类,都可以首先定义为该类的依赖类代码示例package com.self.designmode.uml.dependency;/**原创 2020-12-18 15:50:45 · 156 阅读 · 0 评论 -
Java设计模式(1):设计模式的七大原则
1,设计模式的七大原则1.1,设计模式的目的在程序编写过程中,程序员面临着耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式就是为了让软件,可以更好的满足上面的标准代码重用性:相同功能的代码,不用多次编写代码可读性:编程规范性,便于其他程序员对代码的阅读和理解可扩展性:当需求变更,需要增加新的功能时,能最小改动,最快时间实现可靠性:增加新的功能时,对现有功能没有影响通过设计,使程序呈现出高内聚,低耦合的特性1.2,设计模式的七大原则单一职责原则接口隔离原则原创 2020-12-18 15:38:56 · 202 阅读 · 1 评论