0
点赞
收藏
分享

微信扫一扫

设计模式笔记

Fifi的天马行空 2022-03-13 阅读 92

前言

仅记录学习笔记,如有错误欢迎指正。
最近打算重新整理一下笔记,好好回顾一下之前学的东西。争取在6月份之前整理完毕,加油加油。

概念:

设计模式是对代码开发经验的总结,是解决特定问题的一系列套路,他不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性 稳健性以及安全性的解决方案。

学习的意义:

设计模式的本质是对象设计原则的实际运用,是对类的封装性、继承性、多态性以及类的关联关系和组合惯性的充分理解。

OOP七大原则:

降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。
  • 开闭原则:对拓展开放,对修改关闭。
  • 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立。
  • 依赖倒置原则:要面向接口编程,不要面向实现编程。 高层不应该依赖低层(解耦)
  • 单一职责原则:控制类的粒度大小、将对象解耦、提高内聚性 一个类只干一件事,实现类要单一。(原子性)
  • 接口隔离原则:为各个类建立他们需要的专用接口。 一个接口只干一件事。
  • 迪米特法则: 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
  • 合成复用原则:尽量先使用组合或者聚合等关联关系来实现,其次再考虑使用继承的关系来实现。(has a 手和人 is a 猫和动物) 少使用继承。

创建者模式:

单例模式*:

饿汉式 默认不会实例化,什么时候用什么时候new。 耗资源,懒汉式记得加synchronized和volatile来避免多线程下的线程不安全问题。只有Enum单例不会被reflect破解。类加载的时候就实例化,并且创建单例对象。
每次对象都是同一个,有点像静态变量。下面是一个线程安全的例子。加个私有的构造方法

在这里插入图片描述
静态内部类方式: 我们既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式
在这里插入图片描述

工厂模式*:

实例对象不用new ,用工厂方法代替;将选择实现类,创建对象统一管理和控制,从而将调用者和我们的类实现解耦。
简单工厂模式不符合开闭原则,增加新信息,需要修改原有代码。但是简单。实际使用的多!
工厂方法模式符合开闭原则,可以拓展,但是大大增加代码量和类的数量。
在这里插入图片描述

抽象工厂模式 :

它提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。不可以增加产品,但是增加产品族。 是一个超级工厂,它可以创建其他工厂,称之为其他工厂的工厂。(汽车零件加工厂)
在这里插入图片描述
----> 汇总产品族的工厂
优点:具体产品在应用层隔离,无需关心创建的细节;将一个系列的产品统一创建。(spring IoC 创建管理bean对象)
缺点:也不符合开闭原则,新增加产品族很麻烦。

建造者模式*:

用户只需要给定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部建造过程和细节隐藏起来)
建造者模式由产品抽象建造者(builder 图纸)、具体建造者(worker)、指挥者(director)等 4 个要素构成;侧重步骤,返回完整对象。(汽车组装工厂)
有指挥者Director:
在这里插入图片描述
无指挥者Director:顺序由工人自己决定:
在这里插入图片描述
优点:将产品的建造和表示分离,实现了解耦,建造者类之间是相互独立的,有利于拓展。符合开闭原则。
缺点:产品具有较多共同点,若是差异性很大则不适用建造者模式,范围有一定限制。
比较!!!!!!!!!看,其实建造者模式就是前面抽象工厂模式和最后的 Test 结合起来得到的。(复合对象)
在这里插入图片描述

原型模式:

1.实现一个接口cloneable
2. 重写一个方法clone();
克隆出来的对象是一样的 存放地址不一样 指向一样(浅拷贝)修改一个会影响另一个。
深拷贝就在克隆的时候再把属性克隆一遍。

结构性模式:松耦合

适配器模式:

目标接口(usb接口),需要适配的类(网线),适配器(转换)对象适配器更常用且符合合成复用原则。类适配器就是继承。
在这里插入图片描述

桥接模式:

桥接模式是将抽象的与它的实现部分分离,使他们都能独立的变化,是一种对象结构模式。
两个独立变化的维度分离,找出关系,抽象类,接口方法,用组合的方式便捷的实现。符合开闭原则。
在这里插入图片描述

装饰模式

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
在这里插入图片描述

外观模式:

一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。(一个接口里放了几个方法)
在这里插入图片描述

享元模式*

通过给定不同的颜色来获取不同颜色的circle
在这里插入图片描述
在这里插入图片描述

组合模式:

树结构,一个CEO下面两个主管,每个主管管4个人。
在这里插入图片描述

代理模式*

SpringAop的底层 和动态代理
静态代理:可以使真实角色的操作更加纯粹,公共业务交给代理角色(中介),实现业务的分工。拓展时方便集中管理。

缺点:一个真实角色(房东),就需要一个代理角色,代理接口必须要重写里面的所有方法,代码量大!
在这里插入图片描述
在这里插入图片描述
动态代理:动态代理的代理类是动态生成的,分为基于接口的动态代理(Jdk)和基于类的动态代理(cglib)
InvocationHandler :反射包下的,使用里面的**invoke()**方法,调用处理程序并返回结果的。
Proxy:生成动态代理实例。
在这里插入图片描述
一个动态代理类可以代理多个类,只要他们实现了同一个接口。

行为型模式:

策略模式:

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。(有点像外观模式?)
好像以前写动物园项目的时候传一个animal(dog,cat)对象,调用他们的eat()方法!
在这里插入图片描述

命令模式:

将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化.
在这里插入图片描述

职责链模式:

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。(拦截器 有个filter chain,日志有 info debug error 等状态)
在这里插入图片描述

状态模式:

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
在这里插入图片描述

观察者模式*:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(zookeeper?)
在这里插入图片描述

中介者模式:

我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息。
在这里插入图片描述

迭代器模式:

JAVA 中的 iterator ,提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
大佬博客:https://thinkwon.blog.csdn.net/article/details/101383722

访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上 的操作。
意图: 主要将数据结构与数据操作分离。
在这里插入图片描述

备忘录模式:

备忘录,撤回CTRL + Z

举报

相关推荐

0 条评论