Java设计模式学习笔记
Java设计模式学习
xiaotai1234
计算机研究生在读,会使用java,javascript,php,c++,c,python等多门编程语言,懂算法,设计模式,jvm虚拟机,并发等。了解操作系统,计算机组成原理,计算机网络等基础底层知识。
展开
-
设计模式-职责链模式
设计模式-职责链模式 1.问题引出 2.传统解决方案 3.传统方案解决OA 系统审批问题分析 传统方式是:接收到一个采购请求后,根据采购金额来调用对应的Approver (审批 人)完成审批。 传统方式的问题分析 : 客户端这里会使用到 分支判断(比如 switch) 来对不同的采 购请求处理, 这样就存在如下问题 (1) 如果各个级别的人员审批金额发生变化,在客户端的也需要变化 (2) 客户端必须明确的知道 有多少个审批级别和访问 这样 对一个采购请求进行处理 和 Approver (审批人) 就存原创 2020-07-13 21:28:01 · 222 阅读 · 0 评论 -
设计模式-策略模式
设计模式-策略模式 1.问题引出 2.传统方案解决鸭子问题 package com.atguigu.strategy; public abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public void quack() { System.out.println("鸭子嘎嘎叫~~"); } public void swim() { System.out.pr原创 2020-07-13 20:30:05 · 216 阅读 · 0 评论 -
设计模式-状态模式
设计模式-状态模式 1.问题引出 2.状态模式 基本介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外 输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类 状态模式的原理类图 3.状态模式解决APP抽奖问题 package com.atguigu.state; /** * 状态抽象类 * @author Administrator * */ public a原创 2020-07-13 18:28:09 · 238 阅读 · 0 评论 -
设计模式-解释器模式
设计模式-解释器模式 1.问题引出 2.传统方案解决 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果 问题分析:如果加入新的运算符,比如 * / ( 等等,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰. 解决方案:可以考虑使用解释器模式, 即: 表达式 -> 解释器(可以有多种) -> 结 果 3.解释器模式 基本介绍 在编译原理中,一个算术表达式通过 词法分析器 形成词法单元,而后这些词法单元再通过 语法分析器 构建语法分析树,最终形成一颗抽象原创 2020-07-13 08:33:13 · 310 阅读 · 0 评论 -
设计模式-备忘录模式
设计模式-备忘录模式 1.问题引出 2.传统解决方案 3.备忘录模式 基本介绍 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的原创 2020-07-12 21:52:21 · 206 阅读 · 0 评论 -
设计模式-中介者模式
设计模式-中介者模式 1.问题引出 2.传统解决方法 3.传统方案存在的问题 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂 各个电器对象彼此联系, 你中有我,我中有你,不利于松耦合. 各个电器对象之间所传递的消息(参数),容易混乱 当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想 ->考虑中介者模式 4.中介者模式 基本介绍 中 介者模式(Mediator Pattern ),用一个中介对象来封装一系列的对象交互。 中介者使各个对象不需要显式地相原创 2020-07-12 09:16:39 · 221 阅读 · 0 评论 -
设计模式-观察者模式
设计模式-观察者模式 1.问题引出 天气预报项目需求,具体要求如下: 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如 发布到自己的网站或第三方)。 需要设计开放型API,便于其他第三方也能接入气象站获取数据。 提供温度、气压和湿度的接口 测量数据更新时,要能实时的通知给第三方 2.传统解决方案 package com.atguigu.observer; /** * 类是核心 * 1. 包含最新的天气情况信息 * 2. 含有 CurrentConditions 对象原创 2020-07-11 16:18:26 · 206 阅读 · 0 评论 -
设计模式-访问者模式
设计模式-访问者模式 1.问题引出 完成测评系统的要求 2.传统方式的问题分析 如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则, 不利于维护 扩展性不好,比如 增加了 新的人员类型,或者管理方法,都不好做 引出我们会使用新的设计模式 – 访问者模式 3.访问者模式 访 问者模式(Visitor Pattern ),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 主要将数据结构与数据操作分离,解决原创 2020-07-09 09:02:17 · 279 阅读 · 0 评论 -
设计模式-命令模式
设计模式-命令模式 1.问题引出 智能生活项目需求 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电。 要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这时 就可以考虑使用命令模式。 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来. 在我们的例子中,动作的请求者是手机a原创 2020-07-08 16:21:03 · 650 阅读 · 0 评论 -
设计模式-模板方法
设计模式-模板方法 1.问题引出 编写制作豆浆的程序,说明如下: 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单, 很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 ) 2.模板方法模式 基本介绍 模板方法模式(Template Method Pattern),又叫模板原创 2020-07-07 10:21:52 · 243 阅读 · 0 评论 -
设计模式-代理模式
设计模式-代理模式 1.代理模式的基本介绍 代理模式:为一个对象 提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的 好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、 创建开销大的对象或需要安全控制的对象 代理模式有不同的形式, 主要有三种 静态代理、理 动态代理 (JDK 代理、接口代理)和 Cglib代理( 可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 2.静态代理 静态代理在使用时原创 2020-07-06 15:42:47 · 1724 阅读 · 1 评论 -
设计模式-享元模式
设计模式-享元模式 1.问题引出 展示网站项目需求 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 2.传统方案解决网站展现项目 直接复制粘贴一份,然后根据客户不同要求,进行定制修改 给每个网站租用一个空间 方案设计示意图 传统方案解决网站展现项目-问题分析 需要的网站结构 相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处原创 2020-07-05 18:23:08 · 559 阅读 · 0 评论 -
设计模式-外观模式
设计模式-外观模式 1.问题引出 影院管理项目 组建一个家庭影院: DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的 功能,其过程为: • 直接用遥控器:统筹各设备开关 • 开爆米花机 • 放下屏幕 • 开投影仪 • 开音响 • 开DVD,选dvd • 去拿爆米花 • 调暗灯光 • 播放 • 观影结束后,关闭各种设备 2.传统方式解决影院管理 传统方式解决影院管理问题分析 在ClientTest 的main方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造原创 2020-07-05 15:01:32 · 289 阅读 · 0 评论 -
设计模式-组合模式
设计模式-组合模式 1.问题引出 看一个 学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图: 2.传统方式解决 传统方案解决学校院系展示(类图) 传统方案解决学校院系展示存在的问题分析 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求 是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,比如对学院、原创 2020-07-05 10:44:51 · 3204 阅读 · 0 评论 -
设计模式-装饰者模式
设计模式-装饰者模式原创 2020-07-04 20:17:45 · 221 阅读 · 0 评论 -
设计模式-桥接模式
设计模式-桥接模式 1.问题引出 手机操作 2.传统方案解决手机使用问题(类图): 3.传统方案解决手机操作问题分析 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本. 解决方案-使用桥接模式 4.桥接模式 基本介绍 桥接模式(Bridge模式)是指:将 实现与 抽象放在两个不同的类层次中,使两个层次可以独立改变原创 2020-07-03 15:53:41 · 285 阅读 · 0 评论 -
设计模式-适配器模式
设计模式-适配器模式 1.问题引出 现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了。 2.适配器模式介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper) 适配器模式属于结构型模式 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式 3.适配器模式工作原理 适配器模式:将一个类的接口转换原创 2020-07-02 21:47:03 · 220 阅读 · 0 评论 -
设计模式-建造者模式
设计模式-建造者模式 1.问题提出 盖房项目需求 需要建房子:这一过程为打桩、砌墙、封顶 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的. 请编写程序,完成需求. 2.传统方式解决 package builder.traditional; public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstra原创 2020-07-01 17:01:13 · 252 阅读 · 0 评论 -
设计模式-原型模式
设计模式-原型模式 1.克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊。 2.传统方式解决克隆羊问题 package prototype.traditional; public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, S原创 2020-06-29 12:17:02 · 3862 阅读 · 0 评论 -
设计模式-工厂模式
设计模式-工厂模式 1.简单工厂模式 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 披萨的种类很多(比如 GreekPizz、CheesePizz 等) 披萨的制作有 prepare,bake, cut, box 完成披萨店订购功能。 package com.atguigu.factory.simplefactory.pizzastore.pizza; //将Pizza 类做成抽象 public abstract class Pizza { protected String name; //名原创 2020-06-28 22:04:40 · 205 阅读 · 0 评论 -
设计模式-单例模式
1.介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。 2.单例设计模式八种方式 饿汉式( ( 静态常量) ) 饿汉式(静态代码块 ) 懒汉式(线程不安全) 懒汉原创 2020-06-28 19:03:12 · 233 阅读 · 0 评论 -
设计模式概述
设计模式概述 1.掌握设计模式的层次 第1层:刚开始学编程不久,听说过什么是设计模式 第2层:有很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道 第3层:学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的 第4层:阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会 设计模式的精妙和带来的好处。 第5层:代码写着写着,自己都没有意识到使用了设计模式,并且熟练的写了出来。 2.设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的原创 2020-06-27 16:40:53 · 205 阅读 · 0 评论 -
UML类图六大关系
UML类图六大关系 1.依赖关系 只要是在 类中用到了对方 ,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了。 public class PersonServiceBean { private PersonDao personDao;//类 public void save(Person person){} public IDCard getIDCard(Integer personid){} public void modify(){ Department department原创 2020-06-27 12:43:28 · 1243 阅读 · 0 评论 -
UML类图
UML类图 1.UML基本介绍 UML——Unified modeling language UML( 统一建模语言 ),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果 UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等,如右图: 使用UML来建模,常用的工具有 RationalRose , 也可以使用一些插件来建模 2.UML图 画UML图与写文章差不多,都是原创 2020-06-27 12:31:27 · 301 阅读 · 0 评论 -
设计模式原则-合成复用原则
设计模式原则-合成复用原则 1.介绍 原则是尽量使用合成/聚合的方式,而不是使用继承。 2.设计原则核心思想 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 针对接口编程,而不是针对实现编程。 为了交互对象之间的松耦合设计而努力 ...原创 2020-06-27 10:38:50 · 260 阅读 · 0 评论 -
设计模式原则-迪米特法则
设计模式原则-迪米特法则 1.概述 一个对象应该对其他对象保持最少的了解 类与类关系越密切,耦合度越大 迪米特法则(Demeter Principle)又叫 最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息 迪米特法则还有个更简单的定义:只与直接的朋友通信 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,原创 2020-06-27 10:23:50 · 219 阅读 · 0 评论 -
设计模式原则-开闭原则
设计模式原则-开闭原则 1.概述 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。 当软件需要变化时,尽量 通过扩展软件实体的行为来实现变化,而 不是通过修改已有的代码来实现变化。 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。 2.问题抛出 package com.atguigu.principle.ocp; public class原创 2020-06-27 09:45:55 · 588 阅读 · 0 评论 -
设计模式原则-里氏替换原则
设计模式原则-里氏替换原则原创 2020-06-27 08:31:14 · 221 阅读 · 0 评论 -
设计模式原则-依赖倒转原则
设计模式原则-依赖倒转原则 1.概念 依赖倒转原则(Dependence Inversion Principle)是指: 高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置)的中心思想是面向接口编程 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细原创 2020-06-26 12:15:13 · 306 阅读 · 0 评论 -
设计模式原则-接口隔离原则
设计模式原则-接口隔离原则 1.概念 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上 先看一张图: 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。 按隔离原则应当这样处理: 将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则 2.原始出现的问题 package com.原创 2020-06-26 11:33:33 · 217 阅读 · 0 评论 -
设计模式原则-单一职责原则
设计模式原则-单一职责原则 1.概念 对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。 2.问题的提出 package com.atguigu.principle.singleresponsibility; public class SingleResponsibility1 { public static void main(String[] args) { // TODO原创 2020-06-26 10:58:48 · 217 阅读 · 0 评论 -
设计模式七大原则
设计模式七大原则 1.设计模式的目的 编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让 序 程序( 软件) ,具有更好 代码重用性 (即:相同功能的代码,不用多次编写) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响) 使程序呈现 高内聚, 低耦 合的特性 2.设计模式七大原则 设计模式原则,其实就是程序原创 2020-06-26 10:37:13 · 230 阅读 · 0 评论 -
java中单例模式的学习
单例模式 1.所谓类的单例设计模式,就是对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。首先必须将类的构造器的访问权限设置为private,这样就不能使用new在类的外部产生对象。指向类内部产生的该类对象的变量必须定义为静态的。 2.饿汉式单例模式 package leet; public class Timu { public static void main(String[] args) { Book book1 = Book.getIns();原创 2020-05-25 16:42:38 · 229 阅读 · 0 评论 -
Java中代理设计模式的学习
代理设计模式 代理设计模式主要指的是一个核心的业务功能,通过其他的辅助的业务手段来实现完整的业务操作。 一般来讲代理设计模式往往会有一个比较核心的主题,而这个主题都会通过接口来进行定义,也就是说在接口中定义好核心主题与代理主题的核心的业务处理方法,而后代理主题和核心业务主题都有一个各自的类,负责具体的操作实现,最终实现是依据代理主题来包裹核心业务主题的模式完成的。 ...原创 2020-05-22 17:13:20 · 235 阅读 · 0 评论 -
Java中工厂模式的学习
工厂模式 一般情况下实现接口的方式是采用多态中向上转型的方式,比如定义了一个接口Book,并且定义了一个它的实现类MyBookImpl,一般做法是Book book = new MyBookImpl()。这种做法中接口和子类的耦合性很高,为了降低耦合性,就需要引入一个中间过渡,就是工厂。 package gongchang; public interface XueXi { public abstract void yuwen(); } //工厂相当于中间过渡,返回对象 class Factory原创 2020-05-22 15:57:51 · 189 阅读 · 0 评论 -
Java中适配器模式的学习
适配器模式 问题:在实际开发过程中,接口最为常见的定义格式就是定义一系列的抽象方法,按照传统的实现,即便某些子类不需要接口中的某些方法,也不得不去进行方法的重写。 为了解决这个问题就需要找到一个替代品,这个替代品负责假实现接口中的所有方法,同时又不能直接使用,这个替代品就是抽象类。 适配器模式就是让一个接口的实现类去继承一个抽象类,而这个抽象类中有这个实现类所需要的的接口中的相关方法。 package shipeiqi; //接口中定义了三个抽象方法 public interface XueXi {原创 2020-05-22 15:27:49 · 216 阅读 · 0 评论