设计模式
dongpingwang
这个作者很懒,什么都没留下…
展开
-
DCL单例模式问题
DCL单例模式问题《Java并发编程实践》第16章 Java存储模式《深入理解Java虚拟机》第12章Java内存模式与实践原创 2021-10-23 14:06:13 · 128 阅读 · 0 评论 -
Android源码中的设计模式
Android源码中的设计模式单例模式懒汉式单例frameworks\base\core\java\android\bluetooth\BluetoothAdapter.javapublic final class BluetoothAdapter { /** * Lazily initialized singleton. Guaranteed final after first object * constructed. */ private原创 2021-03-18 23:57:13 · 226 阅读 · 0 评论 -
状态模式
一.小结定义:允许对象内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。优点:1.结构清晰,避免了过多的if-else,提高了系统的可维护性 2.将所有与某个状态有关的行为放到一个类中,遵循单一职责,很容易新增一个状态 3.封装性非常好,将状态变换放置到类的内部来实现,遵循开闭原则缺点:状态有关的子类随着状态的增加而增加,可能导致子类太多使用场景:1.行为随状态改变而改变的场景 2.条件、分支判断语句的替代者通用UML图:二.例子 周一到周五我们作为打工人努力工作,周末原创 2020-12-14 23:23:53 · 88 阅读 · 0 评论 -
访问者模式
一.小结定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。优点:1.符合单一职责原则 2.优秀的扩展性 3.灵活性高缺点:1.具体元素对访问者公布细节,违反了迪米特原则 2.具体元素的变更比较困难 3.访问者依赖了具体类,违背了依赖倒置原则使用场景:业务规则要求遍历多个不同的对象通用UML图二.例子 有一些公司要求程序员写周报总结,交给老板察看。对于研发组,老板一般只关心研发组长的周报,而研发组长会检查每个组员的周报。针对这原创 2020-12-13 20:17:10 · 151 阅读 · 1 评论 -
备忘录模式
一.小结定义:在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态。这样可以在以后将对象恢复到原先的状态。优点:1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态 2.实现了信息的封装,使得用户不需要关心状态的保存细节缺点:消耗资源,如果类的成员变量过多,势必会占用比较在的资源,而且每次保存都会消耗一定的内存使用场景:1.需要保存恢复数据的相关状态场景 2.提供一个可回滚的操作通用UML图二.例子 通用的备忘录模式代码如下:原创 2020-12-12 23:32:24 · 85 阅读 · 0 评论 -
外观模式
一.小结定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。优点:1.减少系统的相互依赖 2.提高了灵活性 3.提高安全性缺点:不符合开闭原则,如果外观对象出现错误后只能修改外观对象使用场景:1.为复杂的模块或子系统提供一个对外界访问的接口 2.子系统相对独立 3.预防低水平人员带来的风险扩散注意事项:外观对象不参与子系统内的业务逻辑。通用UML图二.例子 平时我们去商店买东西,用手机扫柜台上的收款码用微信或者支付宝付原创 2020-12-12 11:34:30 · 117 阅读 · 0 评论 -
组合模式
一.小结定义:将对象组合成树形结构以表示”部分-整体“的层次结构,使得用户对单个对象和组合对象的使用具有一致性。优点:1.高层调用简单 2。节点自由增加缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。形式:透明形式、安全形式通用UML图二.例子 电脑上某个磁盘,里面有许多的文件夹,文件夹里面有许多的文件,磁盘-文件夹-文件形成一种类似树状的结构,可以用组合模式来描述这种关系。组件接口原创 2020-12-12 09:36:25 · 109 阅读 · 0 评论 -
观察者模式
一.小结定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。优点:1.观察者和被观察者是抽象耦合的 2.建立一套触发机制缺点:1.观察者过多的情景下会降低效率 2.观察者不知道所观察的目标具体的变化,只是知道观察目标发生了变化。常见的例子:许多基于观察者模式的事件库,如EventBus、Otto等;接口回调等通用UML类图二.例子 下面以文件系统监听文件变化为例:被观察者public class FileSystem {原创 2020-12-09 23:37:38 · 223 阅读 · 0 评论 -
迭代器模式
一.小结定义:提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。优点:1.它支持以不同的方式遍历一个聚合对象 2.迭代器简化了聚合类 3.在同一个聚合上可以有多个遍历 4.新增聚合类和迭代器类都很方便缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要增加相应的迭代器类,在一定程度上增加了系统的复杂性使用场景:JDK中很多集合类都实现Iterable,是迭代器模式的体现;现实中,基本很少写一个迭代器。通用UML图二.例子 下面通过迭代器模式来模拟原创 2020-12-08 23:04:28 · 67 阅读 · 0 评论 -
适配器模式
一.小结定义:将一个类的接口转换成客户希望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。优点:1.可以让两个没有任何关联的类一起运行 2.提高类的复用 3.增加类的透明度 4.灵活性好缺点:过多地使用适配器,会让系统非常混乱,不易整体把握。使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。适配器模式通常作为一种补救模式。通用UML图:二.例子 随着手机的发展,手机耳机孔几乎消失了,原先3.5mm耳机现在就需要使用转接头来变成typ原创 2020-12-06 10:43:49 · 129 阅读 · 0 评论 -
策略模式
一.小结定义:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。主要解决:在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护。优点:1.算法可以自由切换 2.避免使用多重条件判断 3.拓展性好缺点:1.策略类会增多 2.所有策略类都需要对外暴露。注意点:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。通用UML图:二.例子 在学习程序的时候,策略模式的"计算器"十分经典,列举如下:抽离两数运算的算法p原创 2020-11-30 21:20:34 · 162 阅读 · 0 评论 -
装饰器模式
一.小结定义:动态地给一个对象添加一些额外的功能。就增加功能来说,装饰器模式相比生成子类更为灵活。优点:1.装饰类和被装饰类可以独立发展,不会相互耦合。2.是继承的一个代替的方式。2.可以动态扩展一个实现类的功能。缺点:多层装饰比较复杂。通用UML图:二.例子 在早前科技还不发达的日子,在QQ上装饰自己勾搭陌生人的时光真的很让人怀念,像《第一次的亲密的接触》中所描述的青春与美好。但现在的网络中充满了太多不好的因素,让人谨慎,希望大家能够"让上帝的归上帝,恺撒的归恺撒,网络的归网络,现实的原创 2020-11-28 20:06:48 · 98 阅读 · 0 评论 -
责任链模式
一.小结定义:为请求创建了一个接收者对象的链,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,并且沿着这条链传递请求,直到有对象式处理它为止。优点:1.将请求与处理分开,降低耦合度。2.灵活性,增加新的处理类很容易。缺点:1.处理链过长会影响性能 2.调试不很方便。通用UML图:二.例子 抗日剧中有句经典的台词,“营长没了,团长上,团长没了,师长上”,形成了一条营长->团长->师长的冲锋链,这里模拟下这个情景开战请求public interface IW原创 2020-11-28 10:24:36 · 82 阅读 · 0 评论 -
命令模式
一.小结定义:将一个请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。优点:1.降低了系统的耦合度 2.新的命令可以很容易添加到系统中去。缺点:使用命令模式可能会导致某些系统有过多的具体命令类。使用场景:认为是命令模式的地方都可以使用命令模式。例如,在GUI开发中,一个按钮都一条命令。2.模拟CMD等。通用UML如下二.例子 生活中,带耳机听歌睡觉时,一般都更喜欢通过耳机去切歌、暂停等,这里来模拟这个场景定义一原创 2020-11-21 11:37:40 · 115 阅读 · 0 评论 -
中介者模式
一.小结定义:通过引入一个中介者来处理各个对象之间的通信,降低各个对象间的相互作用与耦合。特点:降低类之间的耦合、将一对多软化为一对一关系;有些情景下中介者会很膨大很复杂。通用UML类图如下:常见形式:MVC/MVP架构、三层架构等;生活中租房中介、留学中介、网购等。二.例子 最近刚好双十一时期,剁手狂潮哈哈。这里以网购为例,我们通过淘宝京东购买物品,淘宝京东平台充当一个中介,承担着买家与卖家的交易。代码Demo如下//1.封装各个同事角色之间的依赖行为public原创 2020-11-13 23:21:25 · 318 阅读 · 0 评论 -
原型模式
一.小结意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象。特点:性能优良、逃避构造函数的约束(原型模式clone创建对象时构造函数不会执行);必须实现 Cloneable 接口、对已有的类不一定容易实现。使用场景:资源优化的场景、性能和安全要求的场景等。注意事项:深拷贝与浅拷贝java中原型模式UML类图二.例子 JDK中提供的CopyOnWriteArrayList,部分源码如下public class CopyOnWriteArrayList&原创 2020-11-10 20:55:46 · 116 阅读 · 0 评论 -
代理模式
一.小结定义:为其它对象提供一种代理以控制对这个对象的访问。特点:职责清晰、高扩展性、智能化;由于在客户端和真实对象之间增加了代理角色,可能造成请求变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。分类:根据是否已知具体的契约(接口)分为动态代理和静态代理,根据是否指定特定的代理角色分为强制代理和普通代理。通用UML类图举例:小米手机的饥饿营销,每当小米手机新品发布后,一般需要抢购,米粉(真实角色)很难第一时间抢到,只能找黄牛(代理角色)加价购买。(以上仅供举例,原创 2020-11-09 23:12:30 · 238 阅读 · 2 评论 -
建造者模式
一.小结 定义为一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。经典的建造者模式一般有Product、Builder、ConcreteBuilder、Director几个角色,由Director按照不同的规则建造具体的Product;现在常见的建造者模式一般只有Product和Builder两个角色,通过链式调用来产生不同的Product。二.经典的建造者模式 如上图所示,建造者模式有4个角色。代码略Product: 最终要生成的对象原创 2020-10-24 21:12:03 · 112 阅读 · 0 评论 -
模板方法模式
一.小结 模板方法模式是一种十分简单的设计模式,定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其UML类图如下:二.例子 这里以王者荣耀游戏为例,游戏中通过推倒敌方一路的防御塔与基地获胜。不管是从上中下哪一路开推,也不管击杀敌方多少英雄,都是要推一塔、二塔、高地、基地,最后取得胜利。比如AG战队打法很主动疯狂打架滚经济,TS战队防御为主后期靠一波团战打赢取胜,两种不同的打法最后取得的胜利原创 2020-10-06 13:09:45 · 230 阅读 · 0 评论 -
工厂模式
一.小结 工厂模式用于创建具有相同属性的产品的一种方式。根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。二.简单工厂模式 简单工厂模式通用UML图如下: 下面以一个书籍的分类来说明:// 1.书籍基类public interface IBook { String content();}// 2.小说与传记两个具体的书籍类别public class原创 2020-10-03 17:55:10 · 86 阅读 · 0 评论 -
单例模式小结
一.总结 单例模式是一种十分简单的设计模式,在程序中只有一个实例,占用空间小,但是方法多难扩展,我在项目中一般定义为工具类或者管理者。单例模式有不同的写法,我推荐用静态内部类或者枚举类的方式, 双重加锁的懒汉模式在一些代码检查工具如PMD中会提示线程不安全。通用类图如下:二.常见的写法懒汉模式public class LazySingleton { private static LazySingleton instance; private LazySingleton()原创 2020-09-19 00:03:31 · 125 阅读 · 0 评论 -
设计模式之六大原则
一.六大原则(SOLID)单一职责原则(Single Responsibility Principle)开闭原则(Open Closed Principle)里氏转换原则(Liskov Substitution Principle)迪米特法则(Law of Demeter)接口隔离原则(Interface Segregation Principle)依赖倒置原则(Dependence Inversion Principle)二.单一职责原则 定义:一个类的变化只有一个原因引起。三.开原创 2020-09-06 21:30:09 · 156 阅读 · 0 评论