| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> java设计模式快速学习 -> 正文阅读 |
|
[Java知识库]java设计模式快速学习 |
????????最近在看java设计模式的相关资料和书籍,因为设计模式的内容非常的多,光是书籍都有很多,每次想复习的时候总是怕漏掉某些设计模式没有学习到,今天写一下博客整理一下自己之前学习设计模式的时候用到的一些方法。本文只是做一个简单的复习和回顾,没有代码罗列以及大量的类图展示,也希望以自己个人的理解角度去从一个侧面去理解设计模式。 目录 ? ? ? ? 本文可以配合下面的链接去查阅设计模式代码实现以及类图展示 一、重点知识快速记忆1、设计模式七大设计原则:SOLIDDA单一职责-S,开闭原则-O,里氏替换原则-L,接口分离-I,依赖导致原则-D 迪米特原则-D,组合聚合复用原则-A 2、23种设计模式设计模式分为创建型,结构型,行为型三种 用一句口诀进行记忆: ? ? ? ? “弹弓原件,外援组佩戴桥式,爹责令房中介装备观测版” (1)“弹弓原件”对应5种创建型模式 ????????单例,工厂(简单工厂,抽象工厂),原型,建造者 (2)“外援组佩戴桥石”对应7种结构型模式 ? ? ? ? 外观,享元,组合,适配,代理,桥接,装饰 (3)“爹责令,房中介,装备观测版”对应的是11种行为型模式 ? ? ? ?得带器,责任链,命令,访问者,中介者,解释器,状态,备忘录,策略,模板 二、设计模式的七种设计原则? 单一职责:一个类只负责一个或一类职责,简化代码复杂度,提高可读性 ? 开闭原则:即对扩展开放,对修改关闭,通过抽象约束,封装变化来约束随意修改类 ? 里氏替换:子类继承父类,但是不修改父类,从而达到不修改原有方法基础上实现新功能 ? 接口隔离:接口更小粒度,功能更聚合,通过不同接口对实现类的功能进行隔离 ? ?依赖倒置:高层模块之类不依赖与底层模块,面向接口编程而不是面向过程编程 ? ?迪米特法则:即最少知道原则,即外部接口不直接调用内部接口,而是通过接口调用 ? ?组合聚合复用原则:减少继承复用,而是采用组合和聚合对象进行复用原则。 三、创建型设计模式1、单例模式?(1)单例模式结构,私有构造器,共有getInstance方法,私有静态Instance对象 ?(2)单例模式的几种形式
2、简单工厂模式? ? ?简单工厂的组成:抽象产品,具体产品,简单工厂,其中具体产品实现抽象产品,在工厂内部通过条件表达式判断需要new具体的对象实例。 3、抽象工厂模式?????????工厂模式:工厂模式比简单工厂更进一步,举个例子,如果说简单工厂是一维直线通过直接表达式直接抵达创建对应对象,则工厂模式则是二维平面,一个横向的抽象工厂,一个纵向的创建对象。 ????????组成部分是,抽象工厂,具体工厂,抽象产品,具体产品4个要素组成,相对于简单工厂,即在工厂的层次上更加抽象了一层,从而增加了一个纬度,具体实现类似简单工厂。 ????????抽象工厂的组成: 抽象工厂是在工厂模式上更进步了一层,相当于做了一个三维立体结构,即在抽象工厂的基础上,增加了一个抽象工厂族,即一个工厂类型,结构依旧是抽象工厂,具体工厂,抽象产品,具体产品,区别是抽象工厂中有多个创建工厂族的接口,相当于不同的工厂线,通过工厂线生产工厂,通过工厂生产线生产产品。 4、建造者模式? ? ?建造者模式,即将一个复杂对象的构造与他的表示进行分离,例如一套电脑设备 ? ? ?建造者有四个角色:产品角色,抽象建造者,具体建造者,指挥者 ? ? ?其中,指挥者依赖具体建造者对象(封装了内部的构建过程),具体建造者对象实现抽象建造者对象(内部依赖不同的产品角色对象),产品角色对象是复杂对象的不同组成单位。 5、原型模式? ? ?原型模式具体作用在进行对象拷贝的时候,要求对象实现Cloneable接口以及Serializer接口 ? ? ?1、浅拷贝,即Entity类只实现了cloneable接口,内部仅仅是简单的原始类型和封装类型的拷贝,而对于集合类型和依赖对象类型并没有深入拷贝 ? ? ?2、深拷贝有三种实现方式, ? ? ? ? JAVA几种方式实现深拷贝 - 小家猫 - 博客园 ? ? ? ? 第一种:手动实现clone接口,在接口内部操作属性和依赖属性拷贝 ? ? ? ? 第二种:通过Object的clone方法进行拷贝内部对象 ? ? ? ? 第三种:ObjectOutputStream对象流进行拷贝对象 ? ? ? ? 第四种:通过序列化的方式,例如JSON序列化(这种方式比较常用) 四、结构型模式1、外观模式? ? ? ? ? 外观模式可以类比如政务中心,将各个政府部门的部分职责提供给一个统一的对外开放窗口,让用户可以只需要通过一个窗口就能够办理原来需要跑若干个部门才能解决的事情。也可以类比于点菜时的菜单,即用户只需要通过菜单这个外观面板操作,而不需要知道后厨里面怎么实现。 ? ? ? ? ?外观模式是迪米特法则的典型实现,即提供系统统一的窗口,让外部最少知道子系统的内部的实现。 ? ? ? ? ?外观模式主要角色包括:子系统角色,外观面板角色,其中外观类中依赖若干个子系统对象,外观对外提供若干个方法,内部有子系统进行工作流转操作。 2、享元模式(Flyweight)? ? ? ? 享元模式是支持系统内细粒度的对象复用的作用。在使用时需要保证享元对象的唯一性和可复用性,使用方式上也是比较灵活。 ? ? ? ? 享元模式的角色分成:抽象享元,具体享元,非享元,享元工厂 ? ? ? ? (1)抽象享元,定义若干个操作费享元对象接口, ? ? ? ? (2)具体享元定义一个细粒度的可复用的对象,并实现抽象享元接口的方法,在方法内部即拥有了享元和非享元对象的全部数据,然后可以进行操作 ? ? ? ? ?(3)非享元,即相对于享元来说不可复用的部分 ? ? ? ? ?(4)享元工厂,作用是保证每个享元对象的唯一性,内部有一个HashMap集合来保存享元部分对象, ? ? ? ? (5)使用时,首先通过key从工厂中获取,如果存在则直接得到享元对象,然后通过抽象享元方法载入非享元数据并使用,如果不存在则创建一个,存放到集合中,然后再使用享元对象。 3、组合模式? ? ? ? 组合模式,首先不要从字面上理解组合模式是不同子系统进行排列组合使用,其实是外观模式。组合模式是一种树形结构模型的解决方案。可以类比于公司的部门组织树形图,即总部门下面若干个子部门,子部门下又可能包含若干个孙部门。其中部门下没有子部门的是叶子节点,部门下面有子部门的是树枝节点,最顶层的是根节点。 ? ? ? ? 组合模式包括抽象构建,树枝构建和树叶构建, ? ? ? (1)抽象构建,定义新增,移除,获取,操作子节点方法 ? ? ? (2)树枝构建和树叶构建都实现了抽象构建,其中树枝构建包含一个List集合用来存放子构建,区分树枝构建和树叶构建的是,树枝构建内部包含了对子构建集合的操作,叶子构建则是不进行操作。 ? ? ?(3)在某些情况下是不用区分树枝构架和树叶构建,而是合并成一个构建。 4、适配器? ? ? ? 适配器模式是在不改变原有类结构的基础上,通过增加适配器类来解决使用上的不兼容的问题。适配器模式分成类适配和对象适配两种方式,简单的说类适配即适配器继承适配者对象从而兼容了适配者,在适配者的基础上进行兼容扩展。对象适配则是直接依赖适配者对象,从而在适配者对象的基础上进行兼容扩展操作。 ? ? ? ? 适配器分为抽象目标接口,适配者,适配器三个角色, ? ? ? ? 类适配方式:抽象目标接口定义了当前系统需要接口,适配器继承适配者并实现抽象目标,从而在适配方法中操作适配者的方法达到兼容目的。 ? ? ? ? 对象适配方式:适配者和适配器实现抽象目标方法,其中适配器类中依赖一个适配者对象,并增加一个以适配者为参数的构造方法,然后可以在抽象目标方法中操作适配者进行兼容。 ? ? ? ? 从整体结构理解上,适配器模式有点类似于静态代理模式和装饰器模式,都是采用接口实现或者继承的方式对目标对象或者适配者记性一层封装操作,其实不同的是不同的目的,适配器目的是兼容适配,代理的目的是保护和隔离,装饰的目的是增强,只要理解了这一层就能够理解到这三者的不同。 5、代理模式? ? ? ? 通常代理分为静态代理和动态代理两种: ? ? ? ? ?静态代理:即开发者自己创建代理类 ? ? ? ? ?动态代理:通过反射机制或者字节码方式动态编译而成, ? ? ? ? ?代理模式的角色包括:抽象主题,目标对象,代理对象,要求是目标对象和代理对象都实现了抽象主题的接口。关键在代理对象中需要依赖一个目标对象,并在实现方法中调用目标对象的同一个方法,在方法调用前,后以及环绕都可以有自己的增强实现。 ? ? ? ? 动态代理的实现方式有,JDK动态代理,cglib动态代理两种实现方式,其内部实现原理都是通过动态字节码编译的方式生成一个$Proxy类,并在JVM编译过程中可以进行调用。 6、桥接模式? ? ? ? 首先还是不要从字面上理解桥接模式,以为是通过一个中间桥梁连接若干个不同的子系统,其实这是中介者模式或者门面模式。桥接模式的作用是将抽象和实现隔离,让类可以独立的发展和变化。 ????????从定义上讲比较难理解,举几个例子,例如咖啡机里面咖啡的温度,咖啡种类,甜度,容量大小等等不同的维度进行不同的组合最后做出来N种不同的咖啡制品。 ? ? ? ? 桥接模式分成,抽象主体,具体主体,抽象扩展,具体扩展,具体实现原理是,具体主体实现了抽象主体,具体扩展实现了抽象扩展,其中具体扩展依赖了抽象主体(并以参数形式传递具体主体的构造方法),这样扩展主体中增加的属性可以附着在具体主体上了。当然主体和扩展反过来理解也是一样,看个人理解。 ? ? ? ? 个人感觉上,这种方式是类关系依赖的一种扩展,通过这种扩展达到了灵活的排列组合的目的,即将抽象和实现隔离,抽象面具后面的实现可以互相替代从而实现快速扩展功能。 ? ? ? ? 注意:举例里面的咖啡机和China人的构建可能让人联想到抽象工厂,但是实际情况确实完全不同,桥接模式可以理解成组件和属性之间的桥接,例如咖啡机里面的咖啡是主体,其他的都是附属的可有可无可默认的属性配置而已。 7、装饰器模式? ? ? ? 装饰模式是在不改变类的原有功能基础上,动态的给对象增加一个职责。该模式我理解为升级版的静态代理模式,基本原理也是装饰对象内部依赖目标对象,然后在目标对象的基础上对原有的功能进行增强处理。是继承模式的一个补充,也可以理解子类继承父类,并重写了父类的方法。 ? ? ? ?装饰模式角色分为:抽象构建,具体构建,抽象装饰,具体装饰, ? ? ? ?抽象构建和具体构建组成了被装饰对象,抽象装饰继承抽象构建接口(增加定义一个增强方法),具体装饰实现抽象装饰类,(内部依赖具体构建对象,并实现抽象装饰方法) 五、行为型模式1、迭代器模式? ? ? ? 迭代器模式主要是作用在集合操作上, 2、责任链模式3、命令模式(Command)? ? ? ? 命令模式理解就是将命令封装成一个对象,用户直接调用命令对象达到间接的操作子系统的目的。例如原来的电视机没有遥控器,我们要换台或者调整声音等等都需要直接上手去电视机上进行操作,现在有了遥控器,我们就可以不用直接上手操作电视机,而通过操作遥控器来发送指令到电视机,让电视机换台或者调声音。 ? ? ? 命令模式分成抽象命令,具体命令,命令执行者,命令发送者几个角色,原理是具体命令实现了抽象命令接口,命令发送者对象中依赖命令角色(或者将命令作为参数调用call),命令角色中依赖了命令执行者(或者采用命令执行者作为参数调用execute) ? ? ? 命令模式实现了调用子系统隔离的作用,这中间其实有很大的操作空间,例如具体命令可以通过工厂模式或者枚举进行替换,命令执行者和命令发送者都可以抽象替换,从而增加了很多实现的可能性。 4、访问者5、中介者? ? ? ? 中介者模式在日常生活中比较常用到,例如租房中介,出租者通过房中介发布租房消息,租房人通过房中介了解租房,最后通过中介完成了租房业务,中间甚至不需要直接和出租者见面。这样即实现了对象解耦, ? ? ? ? 中介者 6、解释器7、状态模式? ? ? ? 状态模式适用于业务操作过程中有多种状态,不同的状态对应不同的行为,这种模式在日常开发中可能会碰到比较多,但是真正灵活运用的很少,因为没有必要为了简单的状态变换而多增加很多个状态类。 ? ? ? ? 状态模式包括抽象状态,具体状态,上下文环境。其中具体状态实现了抽象状态接口(就是达到了可以互相转换替换的作用),上下文环境即当前主体类,依赖了状态对象(构造或者参数形式),并可以操作状态对象(获取,更新,操作等)。注意这里面的主角是状态对象,因此状态对象的内部实现比较重要。 ? ? ? ? 我个人感觉状态模式是一对一依赖模式,不过这里面的一对一的一可以通过抽象替换。 8、备忘录模式9、观察者10、策略模式11、模板方法模式 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:09:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |