设计模式(总结版)

**前言**
作为一名程序员,我觉得很重要的一节课程,那就是设计模式。我见过一些一个类写几千行的代码,写大量冗余的代码,如果需求变更,那么维护上将造成血崩的情况。所以,我总结一些设计方式,希望我自己也不要犯错,有改进之处,希望大家不要私藏,多多纠错,我就先抛砖引玉 diudiudiu~。
我学了一些设计模式,总感觉这个模式跟那个模式好像,哈哈哈。可能是我自己学习资料有问题,傻傻分不清。
另外谴责下自己:本来21年8月底就应该总结这些模式,结果拖到9月。并不是我有多忙,而是不够自律,梦幻西游,王者荣耀,哈利波特 YYDS ~ 千万不能沉迷,要合理安排时间鸭!

在这里插入图片描述

一:单例Single
单例的精髓是私有自己的构造器
1.饿汉式,很好,只是不管你使不使用,我都创建了对象
2.懒汉式,多线程下,返回不是一个对象
3.双重锁,需要在创建对象加volatile,因为jvm 会搞事情 ,跟JIT 有关。两次判断对象是否是空,对字节对象加锁
4.静态内部类,挑刺的人说双重锁性能不好,精益求精的写了静态方法,里面new final 修饰的对象
5.枚举, Effective Java 大佬推荐,不仅解决线程同步,还可以防止序列化,因为枚举类没有构造方法

二: 策略Strategy
策略模式的精髓在于可以自己定义策略.
1.java中的Comparator和Comparable就是典型的应用。
在这里插入图片描述
三:工厂factoryMethod
工厂模式有抽象工厂和简单工厂
也就有个很奇怪的问题:啥时候用抽象类,抽象方法!什么时候用接口!这2个好像差不多,_
个人理解:抽象类一般定义概念,比如工厂,里面有制造食物的,生产交通工具的,军火。
接口一般定义特征:比如会飞,然后飞机,超人,凹凸曼去实现这些接口!

抽象工厂:定义一个抽象工厂,举个栗子,里面有生产食物,生产汽车。
然后一个类继承这个抽象工厂,重写方法。形成一种种族的概念,我是这个一族的,我都有这些特性。
比如我们支付系统,都有查询,转账,这些功能,那么不同的银行也就是一个个族。哈哈哈!
简单工厂:不好扩展,简单来说就是面向接口去new 实现对象。

四:装饰器Decorator装饰器
装饰器模式,就是非常符合可扩展性这么一个思想
下面的例子符合我们思想 买奶茶加奶盖加糯米加珍珠加三分糖加。。。。。。胖死
代码设计:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
五:责任链chainofResponsibility
责任链是个很好的一个设计模式,我们写代码经常遇到,可能没有意识到这里还能用责任链的模式!
灵感来源于生活嘛,比如我们在玩某易游戏时候,输入丁三石养猪,这种就会被和谐成 ‘’少侠,你又调皮了‘ 这样可以净化网络环境,不是吗?
下图模拟了Request和Response的情况,这里用的也是责任链
在这里插入图片描述

六:观察者Observer
很多框架都用这个了,那些注册的ZK,Eureka 肯定用了,观察他出现什么状态变化,做出指定的动作。这东西从开发上就跟责任链很类似,都是一环接着一环。emmmm

七:组合模式Composite
组合模式,跟递归差不多,像老王童鞋写的那个组织递归就很好用hhhhhh怀念下跟老王童靴一起共事的日子,哎~

八:享元 FlyWeight
1.享元模式 类似于线程池 ,String ,在使用前 先创建好,直接去池里拿,没有就创建,再丢到池中
2.类比 String a = “a”; String b = “a”; a == b // true 这是在同一个常量池中拿
3.提到池就不得不多说句,redis 的默认连接池是关闭的,当用户上来时候,这个东西可能会出现慢慢慢慢慢慢

九:代理proxy
代理是个很难,内容又多,JDK动态代理,CGLIB代理
1.聚合方式,比如我是开坦克的,我没有证,所以我请了这个代理人来开,但是去哪里是我说了算,他能在给我做代理时候 加点小动作
2.静态代理,接着上面的代理,然后为了追踪司机边路拉客人,所以要增加一个行驶时间,起止时间需求, new TankLogProxy(new TankTimeProxy(new Tank())).move();
在这里插入图片描述
在这里插入图片描述
3.动态代理
关于动态代理,,这里面的 Object invoke = method.invoke(new Tank(),args);invoke 里只能代理一个对象(我想代理个飞机一起,结果报错了。。。果然代理也不能脚踏两条船),但是他源码是 public Object invoke(Object obj, Object… args)
代码需要结合编译后的class 类看,不然看不懂 hhh
生成方法的源代码 是 asm (java 的汇编语言)
就是反射 通过二进制字节码分析类的属性和方法
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
4. CGCLIB 底层也是用ASM ,ASM 能直接操作字节码指令,
cgclb 通过修改 子类去代理 ,所以划重点 ,要继承 !!!如果当前类用了Final 修饰,如果不使用ASM 则不能代理

在这里插入图片描述

十:迭代器Iterator
迭代器模式嘛,去看下ArrayList 和LinkList 的迭代器的源码就好啦~
下面写下LinkList 简化版本的 ,ArrayList相对简单就不写了。。算了还是写吧
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十一:访问者visitor
1.访问者模式
在结构不变的情况下 - 动态改变对于内部元素的动作,不同访问者,不同场景
万恶的客户本来觉得这件商品卖998并且正式上线,但是太贵了买的人不多,然后客户推出黄金VIP打8折,并附带您还需要消费XX元升级钻石会员,即可享受折上折优惠。上面还有星耀,王者等等会员。这就需要不停的装饰。
十二:构建器Builder
构建复杂对象
当对象的属性很多,用这个
在这里插入图片描述

在这里插入图片描述

十三:原型模式prototype
原型模式 - 也是克隆模式
1.克隆必须实现 Cloneable 接口
2.浅克隆 ,克隆的对象 有其他类的引用又没有实现 implements Cloneable ,数据指向同一个内存地址
3. 深克隆 ,将克隆的类里的类再克隆一份,不同的内存地址

十四:备忘录Memento
1.记录快照
2.存盘

十五:模板TemplateMethod
等于勾子函数把
一个抽象类,有个抽象方法,这个方法中有几个内部的抽象方法,然后拿个类去继承这个抽象类重写那些内部方法

十六:状态state
状态模式
根据状态决定行为
在TCP 连接中在每一种状态下表现出不同的行为 establlshed建立 listen监听 closed 关闭
open();close();acknowledge();
划重点:行为不能增加,指定行为下的状态可以随便扩展
举个栗子:你女朋友的行为有 说话,做事,跟你交流,你就可以把这3个行为做成一个状态抽象类
然后可以写心情好的说话,做事,跟你交流,冷笑情况下说话,做事,跟你交流

后续:嗯,还有一些,我不会或者用处不大,那我就不说了。比如:解释器,命令,桥接,适配器,外观,等我后续补充把!想要了解可以百度把~
下一期更新 : 多线程和高并发!
注:本期课程:源自听马老师的课程,属于个人手写笔记

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值