设计模式
文章平均质量分 83
玉带林中挂
这个作者很懒,什么都没留下…
展开
-
设计模式篇---观察者模式
观察者模式的优点:1、表示层和数据逻辑层分离,并抽象了更新的接口,便于不同的表示层充当观察者角色。2、在观察目标和观察者之间建立了一个抽象的耦合。观察者目标只需要维护一个抽象的观察者集合即可,无需了解具体观察者。3、简化了一对多系统的难度,支持广播通信。4、符合开闭原则,增加新的观察者无需修改原代码。观察者模式的缺点:1、观察者太多的话,有性能问题。2、如果观察者和观察目标之间存在循环依赖,可能导致系统崩溃。原创 2024-02-24 18:41:26 · 1267 阅读 · 0 评论 -
设计模式篇---备忘录模式
【原发器】就是我们要进行备份的东西,【备忘录】和【原发器】基本是一样的,只不过可以把它理解为【原发器】的备份,【负责人】就是客户端的入口,通过它来进行备份和保存,但是它关联的是【备忘录】,并不是【原发器】。当我们保存一个对象在某一时刻的全部状态或部分状态,需要以后它能够恢复到先前的状态时,可以考虑备忘录模式。原创 2024-01-30 13:29:31 · 824 阅读 · 0 评论 -
设计模式篇---中介者模式
中介者模式将一个网状的系统结构变成了一个以中介者对象为中心的星型结构,也是一个“迪米特法则”应用的标准模式,各个对象之间不需要耦合,它们之间的沟通仅需要中介者即可。但因为中介者本身需要关联大量的对象,导致后续的维护比较困难。因此也可以做一个小个改善,将变的地方放到配置中进行维护。//放到配置中心@Override});原创 2024-01-21 18:02:32 · 793 阅读 · 0 评论 -
设计模式篇---命令模式(结合spring+动态代理实现开闭)
命令模式可以降低系统的耦合度,让请求者和接收者完全解耦,并且如果有新的命令加进来,也不用修改之前的代码,符合开闭原则。命令模式和外观模式有些类似,都是通过中间一个对象进行解耦。命令模式更适合操作的切换,比如开关用来开灯,也可以用来开电视,开关作为调用者,可以调用开灯的命令,也可以调用开电视的命令,让调用者和接收者解耦。外观模式更类似一组操作的集合,比如到家后,先换拖鞋,再开电视,最后坐在沙发上,这一系列的操作,可以放在外观层实现,让调用者和具体的子系统解耦。原创 2024-01-05 13:22:16 · 939 阅读 · 0 评论 -
设计模式篇---代理模式
静态代理比较好理解,代理类里面实现了代理的方法。而动态代理的代理对象是通过Proxy创建的,代理的方法是在InvocationHandler里的invoke方法里,和静态代理对比的话,代理类和代理方法是分离开的。原创 2023-12-10 19:30:52 · 1449 阅读 · 0 评论 -
设计模式篇---享元模式
当需要创建大量重复对象的时候,可以考虑使用享元模式。java中的String类,也是用了享元模式。当我们创建一个字符串,如果这个字符串对象第一次创建的话,就会放到享元池中,下次再创建内容相同的字符串对象,新创建的对象就会将它的引用指向第一次创建的对象,不会分配新的内存,以此来实现字符串的共享。打印结果:第三个为false,是因为一开始str4是一个对象,和str1的初始值不同,所以这两个的地址是不一样的。原创 2023-12-10 16:53:54 · 1179 阅读 · 1 评论 -
设计模式篇---外观模式
优点:1、它对客户端屏蔽了子系统,减少了客户端所需处理的对象数目,客户端代码变得很简单。2、它实现了子系统和客户端的松耦合关系,使得子系统的变化不会影响到客户端,只需要更改外观类即可。缺点:1、违背开闭原则,有新的子系统加入需要修改外观类。外观模式和建造者模式的思路很相似。外观模式是将复杂的子系统操作给外观类,客户端直接调用外观类即可;建造者模式是将复杂的操作给指挥者,指挥者内部指挥建造者创建,客户端直接关联指挥者即可。原创 2023-11-22 13:17:30 · 562 阅读 · 1 评论 -
设计模式篇---装饰模式
装饰模式的链路主要是通过继承方式实现的,主要思路是在装饰者类里面包了一层被装饰者,然后客户端调用装饰者的方法时,先实现装饰者自己的装饰方法,然后再实现被装饰者的方法。装饰者模式和代理模式很相似,装饰者是装饰类和被装饰类实现了相同的接口,代理是代理类和被代理类实现了相同的接口,都是增强了能力,但前者是增强了自己,让自己有更多的自定义能力,后者是让别人去处理自己的事情。一个是让自己能力变强,一个是让别人替自己办事。原创 2023-11-17 13:23:26 · 236 阅读 · 0 评论 -
设计模式篇---组合模式
组合模式很适用于处理树形结构的业务场景,主要组件为容器组件和叶子组件,从容器组件开始遍历,一层一层的处理当前组件的业务场景。如果想要扩展新的组件,也无需修改代码,符合开闭原则。当树形结构或者具有整体和部分的层次结构时,希望忽略整体和部分的差异,被客户端一致的对待,可以考虑使用组合模式。原创 2023-10-21 18:11:00 · 825 阅读 · 0 评论 -
设计模式篇---抽象工厂(包含优化)
优化抽象工厂原创 2023-08-19 19:55:38 · 1188 阅读 · 5 评论 -
设计模式篇---工厂方法(包含优化)
里氏替换:子类型必须能够替换掉他们的基类型。依赖倒置:高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象工厂方法比简单工厂更符合开闭原则,当有新的需求时,不用修改之前代码。客户端关注的是抽象的产品,具体工厂里返回的是具体的产品,这就必须让子产品永远可以替代父产品,我们维护每一个工厂类都是在管理具体的子产品。具体工厂对应抽象工厂也是同理。这就是里氏替换的应用。原创 2023-07-22 18:33:14 · 266 阅读 · 1 评论 -
设计模式篇---原型模式
使用原型实例指定待创建对象的类型,并通过复制这个原型来创建新的对象。原创 2023-06-10 18:31:05 · 1194 阅读 · 0 评论 -
设计模式篇---单例模式
当线程A走到上面代码的步骤二时,仅仅是完成了上面实例化对象三步中的第一步,但线程B这时候走到了上面代码的步骤一,判断不为null,则直接返回,此时对象还未实例化完成,这就发生了错误,所以需要使用volatile来进行修饰。单例类拥有一个私有的构造方法,保证外部无法通过new关键字来进行实例化,此外,它还包含一个静态私有成员变量和静态公有的工厂方法,该工厂负责检验实例的存在性并实例化自己,然后存储在成员变量中。故名思义,比较懒,用的时候在实例化,也叫做延迟加载。1、某个类只能有一个实例。原创 2023-06-17 17:45:43 · 1918 阅读 · 0 评论 -
设计模式篇---建造者模式
1、客户端不需要关注具体创建的细节,只需要指定创建者即可。2、相同的创建可以创建不同的产品对象。3、每个建造者不相互影响,符合开闭原则,便于扩展。4、可以控制创建对象的顺序。1、当各个产品之间的差异很大时,不适合使用建造者模式,因此其使用范围受到了一定的限制。2、当具体建造者过多时,如果父类扩展新的抽象方法,则维护起来比较困难。原创 2023-07-01 18:22:50 · 833 阅读 · 0 评论 -
享元模式
简单介绍一下享元模式。一开始看到这个名字,我也不是很理解,为什么叫做“享元”模式,后来看了才明白是共享原物件的意思。定义:运用共享技术来减少内存的占用。如果有一个实例化的例子,然后再有一个和它一样内容的例子的话,就不再进行实例化,它可以和上一个例子共享内存。它分为内部状态和外部状态:内部状态:在享元对象内部不随外界环境改变而改变的共享部分。外部状态:随着环境的改变而改变,不能够...原创 2019-05-18 16:59:51 · 229 阅读 · 6 评论 -
组合模式
举个例子:总公司有A部门和B部门。现在总公司有多个分公司,当然,这几个分公司也有A部门和B部门。现在的做法是为每一个分公司都用相同的代码,都是一个代码复制过来的。当然,这种方法不可取,有如下两个缺点:1、这种做法明显违背了面向对象的原则,如果一行代码出现了问题,那就需要所有的公司都要修改代码,很麻烦。2、没有等级划分,总公司的位置应该高于分公司,这些公司是有一定的组织结构的,不能进...原创 2019-05-12 10:37:58 · 276 阅读 · 4 评论 -
工厂模式
简单工厂模式的组成:抽象类:即父类。具体类:有具体操作的类。继承了抽象类。工厂类:通过工厂,客户端可以直接使用具体类。工厂就是用来加工产品的地方,我客户端只要输入一个东西,工厂就去调用相应的方法,就可以得到输出的结果。看一下具体的工作流程。父类:(运算类) public class Operation//运算类 { private double n...原创 2019-04-30 19:11:21 · 157 阅读 · 2 评论 -
装饰模式
人需要穿裤子,裤子就是装饰者。当然,裤子还可以被上衣再次装饰。就是给对象(人)进行包装。这里有话要说,先占着,酝酿好再写“人”类代码。(后面的装饰类都是对“人”类进行装饰) class Person { public Person() { } private string name; public Person(...原创 2019-05-04 11:50:42 · 143 阅读 · 4 评论 -
代理模式
代理模式是代理类和对象(被代理类)二者共用相同的接口(方法)。客户端通过代理类和对象进行联系。具体看设计模式中的列子,然后进行分析:代理接口:interface IGiveGift//代理接口 { void GiveDolls(); void GiveFlowers(); }被代理的对象:class Purs...原创 2019-05-04 09:34:05 · 147 阅读 · 3 评论