java设计模式学习笔记
文章平均质量分 61
GOF
过期小朋友、
积极主动(找到关注的目标,关注那些力所能及且可以掌控的事情)、以终为始、要事第一
展开
-
java23种设计模式总结
创建型模式:都是用来帮助我们创建对象的!简单工厂模式抽象工厂模式工厂方法模式单例模式建造者模式原型模式结构型模式:关注对象和类的组织!!适配器模式桥接模式组合模式装饰器模式外观模式享元模式代理模式行为型模式:责任链模式解释器模式模板方法模式命令模式迭代器模式终结者模式备忘录模式观察者模式状态模式策略模式访问者模式...原创 2021-06-29 19:57:10 · 121 阅读 · 0 评论 -
设计模式——20备忘录模式memento
场景:– 录入大批人员资料。正在录入当前人资料时,发现上一个人录错了, 此时需要恢复上一个人的资料,再进行修改。– Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word 提示你恢复到以前的文档– 管理系统中,公文撤回功能。公文发送出去后,想撤回来。核心– 就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到 原先的状态。• 结构:– 源发器类Originator– 备忘录类Memento– 负责人类CareTaker开发中常见的应用场景:– 棋类游戏中的,悔原创 2021-06-29 19:50:08 · 144 阅读 · 3 评论 -
设计模式——19观察者模式Observer
场景:– 聊天室程序的创建。服务器创建好后,A,B,C三个客户端连上来公开聊 天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊 天数据分别发给其他在线的客户。也就是说,每个客户端需要更新服 务器端得数据。– 网站上,很多人订阅了”java主题”的新闻。当有这个主题新闻时,就 会将这些新闻发给所有订阅的人。– 大家一起玩CS游戏时,服务器需要将每个人的方位变化发给所有的客 户。上面这些场景,我们都可以使用观察者模式来处理。我们 可以把多个订阅者、客户称之为观察者; 需要同步给多个订阅 者原创 2021-06-28 20:01:57 · 155 阅读 · 1 评论 -
设计模式——18状态模式State
代码:package com.bjsxt.state;public interface State { void handle();}package com.bjsxt.state;public class FreeState implements State { @Override public void handle() { System.out.println("房间空闲!支持预定"); }}package com.bjsxt...原创 2021-06-16 19:25:09 · 124 阅读 · 0 评论 -
设计模式——17 模板方法模式templateMethod
银行办理业务场景:不管去银行办理取钱业务,理财业务,还是存款业务,用户都需要排队取号,办具体业务,给银行人员评分三步。模(mu)板方法设计模(mo)式有两个abstract,一个abstract类为银行模板方法设计模式类,其中有四个方法,分别是取排队具体方法号,抽象方法办理业务方法,具体方法评分反馈方法。然后就是模板方法整套流程怎么做,调用此对象的排队取豪方法,办具体业务方法,父类是抽象的,会去调用子类对象的具体业务方法(钩子,回调,多态),最后调用父类对象的评分方法。代码实现:packa原创 2021-06-16 08:41:28 · 216 阅读 · 0 评论 -
设计模式——16.访问者模式visitor
模式动机:– 对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接 口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访 问者其访问方式也有所不同。• 定义:– 表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变个元素 的类的前提下定义作用于这些元素的新操作。• 开发中的场景(应用范围非常窄,了解即可):– XML文档解析器设计– 编译器的设计– 复杂集合对象的处理...原创 2021-06-15 20:49:14 · 65 阅读 · 0 评论 -
设计模式——15.解释器模式interpreter
"1+23"转变为Java表达式1+23,介绍:– 是一种不常用的设计模式– 用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的 编译器和解释器设计。– 当我们需要开发一种新的语言时,可以考虑使用解释器模式。– 尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用 Jruby,Groovy、java的js引擎来替代解释器的作用,弥补java语言的不足开发中常见的场景:– EL表达式式的处理– 正则表达式解释器– SQL语法的解释器– 数学表达式解析器•原创 2021-06-15 20:48:01 · 84 阅读 · 0 评论 -
设计模式——14.策略模式strategy
报价场景:客户买公司产品,市场部同事如何报价?假设产品定价998元每个。如果是老客户大批量购买,定价85折如果是老客户小批量购买,定价95折如果是新客户大批量购买,定价9折如果是新客户小批量购买,定价原价一般程序员的思路double getPrice(String type,double p){ if(type是老客户大批量){ return p* 0.85; } if(type是老客户小批量){ return p* 0.95; } if(type是新客户大批量){ re原创 2021-06-15 20:44:58 · 100 阅读 · 0 评论 -
设计模式——13.迭代器模式iterator
场景:– 提供一种可以遍历聚合对象的方式。又称为:游标cursor模式– 聚合对象:存储数据– 迭代器:遍历数据结构:– 聚合对象:存储数据– 迭代器:遍历数据基本案例:– 实现正向遍历的迭代器– 实现逆向遍历的迭代器开发中常见的场景:– JDK内置的迭代器(List/Set)实例代码:迭代器接口:package com.bjsxt.iterator;public interface Interator { void first(); void next()原创 2021-05-29 19:31:35 · 93 阅读 · 0 评论 -
设计模式——12.责任链模式chain of responsibility
定义:能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,脸上的对象逐个判断是否有能力处理该请求,如果能责处理,如果不能则传递给链上的下一个对象。场景:打牌时轮流出牌;接力赛跑;请假条审批例子:公司里面,请假条的审批过程:• 如果请假天数小于3天,主任审批• 如果请假天数大于等于3天,小于10天,经理审批• 如果大于等于10天,小于30天,总经理审批• 如果大于等于30天,提示拒绝类:请假信息类:员工名称,请假天数,请假理由抽象领导类:领导名称(构造器),下一个领导(se原创 2021-05-28 09:07:52 · 119 阅读 · 2 评论 -
设计模式——11.享元模式
享元:享就是共享,元就是数据。场景:– 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。核心:– 享元模式以共享的方式高效地支持大量细粒度对象的重用。– 享元对象能做到共享的关键是区分了内部状态和外部状态。• 内部状态:可以共享,不会随环境变化而改变• 外部状态:不可以共享,会随环境变化而改变案例围棋中每一个黑棋子,每一个白棋子,都对应java世界一个对象。就会有黑子有181个对象,白子有180个对象与之对应。每个棋子有颜色,大小,形状,原创 2021-05-25 20:24:31 · 116 阅读 · 0 评论 -
设计模式——10.外观模式 facade
迪米特法则(最少知识原则):– 一个软件实体应当尽可能少的与其他实体发生相互作用。外观模式核心:– 为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。基本案例– 注册公司流程(不使用外观模式)package com.bjsxt.facade;public interface 工商局 { void checkName();}class 海淀区工商局 implements 工商局{ @Override public void checkName() {原创 2021-05-24 19:57:31 · 116 阅读 · 1 评论 -
设计模式——9.装饰模式 decorator
实现细节:– Component抽象构件角色:• 真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰 对象交互。– ConcreteComponent 具体构件角色(真实对象):• io流中的FileInputStream、FileOutputStream – Decorator装饰角色:• 持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象 。这样,就能在真实对象调用前后增加新的功能。– ConcreteDecorator具体装.原创 2021-05-24 19:39:53 · 103 阅读 · 2 评论 -
设计模式——8.组合模式 composite
使用组合模式的场景:– 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。组合模式核心:– 抽象构件(Component)角色: 定义了叶子和容器构件的共同点– 叶子(Leaf)构件角色:无子节点– 容器(Composite)构件角色: 有容器特征,可以包含子节点组合模式工作流程分析:– 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组 合,使得用户在使用时可以一致性的对待容器和叶子。– 当容器对象的指定方法被调用时,将遍原创 2021-05-23 16:42:15 · 126 阅读 · 0 评论 -
设计模式——7.桥接模式 bridge
场景分析– 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?– 这个场景中有两个变化的维度:电脑类型、电脑品牌。不使用桥接模式,代码实现:电脑:package com.bjsxt.bridge.nobridge;public interface Computer { void sale();}class Desktop implements Computer{ @Override public void sale() { .原创 2021-05-20 19:12:18 · 124 阅读 · 2 评论 -
设计模式——6.代理模式proxy
代理模式(Proxy pattern):– 核心作用:• 通过代理,控制对对象的访问! 可以详细控制访问某个(某类)对象的方法{从而实现将统一 流程代码放到代 理类中处理},在调用这个方法前做前置处理,调用这个方法后 做后置处理。(即:AOP的微观实现!)– AOP(Aspect Oriented Programming面向切面编程)的核心实现机制!– 核心角色:• 抽象角色– 定义代理角色和真实角色的公共对外方法• 真实角色– 实现抽象角色,定义真实角色所要实现的业务逻辑, 供代理角色调原创 2021-05-15 21:15:35 · 174 阅读 · 4 评论 -
设计模式——5.适配器模式
• 结构型模式:– 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结 构,用来解决更大的问题。– 分类: • 适配器模式、代理模式、桥接模式、 装饰模式、组合模式、外观模式、享元模式结构型模式汇总代理模式 为真实对象提供一个代理,从而控制对真实对象的访问适配模式 使原本由于接口不兼容不能一起工作的类可以一起工作桥接模式 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继 承结构,使各个维度可以独立的扩展在抽象层建立关联。 组合模式 将对象组合成树状结构以表示”部分和整体原创 2021-05-10 21:03:02 · 115 阅读 · 3 评论 -
设计模式——4.原型模式
• 场景:– 思考一下:克隆技术是怎么样的过程? 克隆羊多利大家还记得吗?– javascript语言中的,继承怎么实现?那里面也有prototype,大家还记得吗?• 原型模式:– 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。– 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点– 优势有:效率高(直接克隆,避免了重新执行构造过程步骤) 。– 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克原创 2021-05-07 21:29:37 · 121 阅读 · 4 评论 -
设计模式——3.建造者模式
场景:– 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样 一个问题需要处理:• 装配这些子组件是不是有个步骤问题?– 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。• 建造模式的本质:– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构 造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;原创 2021-05-06 20:41:33 · 102 阅读 · 0 评论 -
设计模式——2.工厂模式
工厂模式实现了创建者和调用者的分离1 详细分类:简单工厂模式 ; 工厂方法模式; 抽象工厂模式;2 面向对象设计的基本原则OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开 放,对修改关闭。DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程, 不要针对实现编程。LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和 陌生人通信。3 核心本质:– 实例化对象,用工厂方法代替ne原创 2021-05-05 18:57:10 · 140 阅读 · 2 评论 -
设计模式——1.单例模式(测试单例模式的调用效率)
java代码:package com.bjsxt.singleton;import java.util.concurrent.CountDownLatch;/** * 多线程测试 饿汉式、懒汉式、静态内部类式、枚举式调用效率 */public class Client4 { public static void main(String[] args) throws Exception { int threadNum = 10; int times =原创 2021-05-05 09:19:51 · 145 阅读 · 2 评论 -
设计模式——1.单例模式
• 创建型模式:– 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。• 结构型模式:– 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模 式。• 行为型模式:– 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模 式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。就是由软件界大佬GOF总结出的一些java写代码的时候的固定套路。不要背,去用,分析语句好处。1.单例模式一个类只有一个实例对象,提供一个public方法获取这个对象。应用场原创 2021-04-07 09:00:38 · 124 阅读 · 1 评论 -
设计模式(三)策略模式
无论是 Runnable 的 run 方法,还是 Thread 类本身的 run 方法(事实上 Thread 类也 是实现了 Runnable 接口)都是想将线程的控制和业务逻辑的运行分离开来,达到职责分明、 功能单一的原则,这一点与 GoF 设计模式中的策略模式很相似,在本节中,我们一起学习 一下什么是策略模式,然后再来对比 Thread 和 Runnable 两者之间的区别。概念在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改,我们创建表示各种策略的对象和运算规原创 2021-02-03 14:53:40 · 200 阅读 · 0 评论 -
设计模式(二)模板方法
通过阅读T原创 2020-10-20 11:23:51 · 221 阅读 · 2 评论 -
设计模式(一)代理模式
1 内容客户端不直接调用实际对象方法.而是通过调用代理对象方法,来间接调用实际对象方法.类似现实生活中租房子的人去房产中介公司找中介人员获取房源信息,签订租房合约.2 为什么用代理模式?(1)隔离作用租房客户只关心房源在哪儿不关心房主是什么.(2)开闭原则代理类不光是客户类和委托类的中介,还可以增加额外功能.中介公司工作人员还可以提供房屋水管家具维修服务.3 优缺点优点(1)将代理对与真是对象被调用的目标对象分离(2)降低系统耦合性,扩展性好(3)保护目标对象(4)增强目标对象缺原创 2020-09-09 17:32:48 · 383 阅读 · 0 评论