简单说下常用的几种设计模式
1、工厂模式
工厂模式分为3种,
参考资料:https://blog.csdn.net/jason0539/article/details/23020989
https://www.jianshu.com/p/7deb64f902db 抽象工厂模式
2、适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
3、装饰者模式
1、装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被装饰者)的场合,都可以用装饰过得对象代替原始对象。
这里跑出一个问题,感觉不用装饰者这一层也可以啊 ,感觉装饰者一层有一些鸡肋呢?
4、外观模式
外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。门面模式又称为外观模式,它是一种对象结构型模式。
5、享元模式
享元模式是设计模式中少数几个以提高系统性能为目的的模式之一。它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。在享元模式中,由于需要构造和维护这些可以共享的对象,因此,常会出现一个工厂类,用于维护和创建对象。
6、模板方法模式
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
注意模板方法
模板方法
一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
参考资料:https://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html
https://blog.csdn.net/carson_ho/article/details/54910518
7、命令模式
具体细节: 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
1、客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
2、命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
3、具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
4、请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
5、接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
参考资料:https://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html
8、迭代器模式
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式。
说白了就是iterator的实现
参考资料:https://blog.csdn.net/zhengzhb/article/details/7610745
9、观察者模式
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
参考资料:https://blog.csdn.net/itachi85/article/details/50773358
10、中介者模式
定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
注意:中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。
参考资料:https://blog.csdn.net/zhengzhb/article/details/7430098
11、备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态
参考资料:https://blog.csdn.net/zhengzhb/article/details/7697549
12、原型模式
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式的注意事项
1、使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
2、深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
参考资料:https://blog.csdn.net/zhengzhb/article/details/7393528
https://www.jianshu.com/p/89b0fd0ad36b
13、建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,直白点就是建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品
使用场景:
1、适用于那些流程固定「顺序不一定固定」,建造的目标对象会有所改变这种场景「比如画一条狗,这个目标不变,但是不同的是有黄狗,胖狗,瘦狗等」
2、代替多参数构造器
主要作用:
1、在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
2、用户只需要给出指定复杂对象的类型和内容;
3、建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
参考资料:https://juejin.im/post/5a23bdd36fb9a045272568a6
具体代码参考git
14、访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。(我也不太懂)
参考资料:https://www.jianshu.com/p/cd17bae4e949
15、策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽象策略Strategy一般是一个接口,目的只是为了定义规范,里面一般不包含逻辑。其实,这只是通用实现,而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中一般会看到模版方法模式的影子。
策略模式的结构
1、封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
2、抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
3、具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。
参考资料:https://blog.csdn.net/zhengzhb/article/details/7609670
参考资料:https://www.jianshu.com/p/3b1b7812aeea 适配器模式
https://www.jianshu.com/p/c26b9b4a9d9e 装饰者模式
装饰者模式https://blog.csdn.net/qq_27093465/article/details/53323187
https://www.kancloud.cn/digest/xing-designpattern/143728 外观模式
https://www.jianshu.com/p/f88b903a166a 享元模式