23种设计模式总结-java版

目录

源码中的设计模式

设计模式的分类

设计模式的六大原则

设计模式学习的要素

设计模式的简要介绍


源码中的设计模式

源码中用到的设计模式   源码中用到的设计模式_许诗宇的博客-CSDN博客

spring中使用的设计模式   spring中使用的设计模式_许诗宇的博客-CSDN博客

Mybatis中使用的设计模式   Mybatis中使用的设计模式_许诗宇的博客-CSDN博客

设计模式的分类

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式简单工厂模式)、抽象工厂模式单例模式建造者模式原型模式

结构型模式,共七种:适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式

行为型模式,共十一种:策略模式模板方法模式观察者模式迭代器模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式

具体的设计模式的总结在链接的网页中,这一页是设计模式的入口。

其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:

常用设计模式一览表

类型模式名称学习难度使用频率
创建型模式 Creational Pattern单例模式 Singleton Pattern★☆☆☆☆★★★★☆
创建型模式 Creational Pattern简单工厂模式 Simple Factory Pattern★★☆☆☆★★★☆☆
创建型模式 Creational Pattern工厂方法模式 Factory Method Pattern★★☆☆☆★★★★★
创建型模式 Creational Pattern抽象工厂模式 Abstract Factory Pattern★★★★☆★★★★★
创建型模式 Creational Pattern原型模式 Prototype Pattern★★★☆☆★★★☆☆
创建型模式 Creational Pattern建造者模式 Builder Pattern★★★★☆★★☆☆☆
结构型模式 Structural Pattern适配器模式 Adapter Pattern★★☆☆☆★★★★☆
结构型模式 Structural Pattern桥接模式 Bridge Pattern★★★☆☆★★★☆☆
结构型模式 Structural Pattern组合模式 Composite Pattern★★★☆☆★★★★☆
结构型模式 Structural Pattern装饰模式 Decorator Pattern★★★☆☆★★★☆☆
结构型模式 Structural Pattern外观模式 Façade Pattern★☆☆☆☆★★★★★
结构型模式 Structural Pattern享元模式 Flyweight Pattern★★★★☆★☆☆☆☆
结构型模式 Structural Pattern代理模式 Proxy Pattern★★★☆☆★★★★☆
行为型模式 Behavioral Pattern职责链模式 Chain of Responsibility Pattern★★★☆☆★★☆☆☆
行为型模式 Behavioral Pattern命令模式 Command Pattern★★★☆☆★★★★☆
行为型模式 Behavioral Pattern解释器模式 Interpreter Pattern★★★★★★☆☆☆☆
行为型模式 Behavioral Pattern迭代器模式 Iterator Pattern★★★☆☆★★★★★
行为型模式 Behavioral Pattern中介者模式 Mediator Pattern★★★☆☆★★☆☆☆
行为型模式 Behavioral Pattern备忘录模式 Memento Pattern★★☆☆☆★★☆☆☆
行为型模式 Behavioral Pattern观察者模式 Observer Pattern★★★☆☆★★★★★
行为型模式 Behavioral Pattern状态模式 State Pattern★★★☆☆★★★☆☆
行为型模式 Behavioral Pattern策略模式 Strategy Pattern★☆☆☆☆★★★★☆
行为型模式 Behavioral Pattern模板方法模式 Template Method Pattern★★☆☆☆★★★☆☆
行为型模式 Behavioral Pattern访问者模式 Visitor Pattern★★★★☆★☆☆☆☆

设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承,即多使用组合

设计模式学习的要素

1、设计模式要解决的问题(使用该设计模式的场景)

2、设计模式的解法(结构图+关键代码)

3、设计模式的应用实例(软件+生活)

4、设计模式的优缺点及注意事项

设计模式的简要介绍

创建型模式

工厂方法模式:有抽象工厂,多少个产品就有多少个具体工厂类。

简单工厂模式:静态工厂方法,一个静态方法/工厂 生产所有产品。

抽象工厂模式:有抽象工厂,生产一族产品,一个工厂,多个方法,生产多种产品。具体工厂生产具体的一族产品。

单例模式:该类只有一个实例,私有构造函数,静态的getInstance方法。

饿汉式,private static final。

双重检查锁定懒汉式,private volatile static,里面两个if判断,synchronized 该类.class。

IoDH,内部类Holder private static,内部类的变量instance private static final,调用Holder.instance

枚举类,enum SingletonInstance  里面有个INSTANCE

建造者模式:产品类有多个部分,建造类有多个方法,分别创建产品类的多个部分,指挥者类有construct方法,调用注入指挥者类的建造类的各个方法,构建出一个产品。

原型模式:产品类有clone方法,返回一个与自己一样的产品,视情况完成浅拷贝或深拷贝。

结构型模式

适配器模式:把用户的请求转换为适配者接口的调用。对象适配器,用户需要抽象类A的方法a,现在有适配者类B的方法b,类C继承A,内部被注入B,实现方法a,内部调用B的b方法。类适配器,C继承B,实现A的接口,实现方法a,内部调用继承来的b方法。

装饰器模式:不改变对象本身功能,给对象增加额外的新行为。抽象产品类接口A有方法a。具体实现类B实现A。装饰类C实现A,注入一个A,方法a内调用A的方法a。具体装饰类D继承C,方法a内实现自己的逻辑+super.a()。

代理模式:用户不直接访问对象,采用代理类来间接访问对象。抽象接口A有方法a,具体实现类B实现A。代理类实现A,注入一个A,方法a内调用A的方法+自己的逻辑。

外观模式:为子系统中的一组接口提供一个统一的入口。一堆具体类A,B。外观类C,内部注入A,B,提供方法给用户使用,方法内部调用A,B的方法。

桥接模式:类存在两个独立变化的维度,将每个维度独立出来。抽象类A和抽象类B,A内部被注入B。具体类C继承A,D继承B,C里有自己的方法,同时还调用被注入的B的方法。

组合模式:让叶子对象和容器对象的使用具有一致性。透明组合模式,抽象构建类A有增删和方法a。叶子类B继承A,增删方法抛出异常,实现方法a。容器类C基础A,内部有容器,容纳多个A,实现增删方法,方法a是对内部所有的A,调用它们的a方法。安全组合模式,A和B只有方法a,C有a和增删方法。

享元模式:将具有相同内部状态的对象存储在享元池中,享元池中的对象是可以实现共享的。内部状态可以共享,外部状态由用户保存。抽象享元类A,提供方法设置内部状态和接受外部状态。具体享元类B,继承A。享元工厂C,内部有B的集合,提供方法返回B,保证内部状态相同B只有一个。

行为型模式

策略模式:将算法的定义与使用分开,使用算法的环境类针对抽象策略类进行编程。抽象策略类A,方法a。具体策略类B继承A。环境类C,内部注入A,方法c内部调用A的方法a。

模板方法模式:抽象类A有模板方法a,定义整个算法的框架,抽象方法b,具体方法c,钩子方法d。具体模板类B继承A,实现b,看情况实现c和d,从而影响方法a的执行结果。

观察者模式:一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。抽象观察类A,有update方法。具体观察类B,继承A,实现update方法。抽象被观察类C,有增删观察者方法,通知方法notify。具体被观察类D,继承C,内部有A的容器,实现增删观察者,实现notify方法,调用所有A的update方法,业务方法完成后,调用D的notify方法。推模式,将需要的数据作为update的参数。拉模式,将D自己作为update的参数或者B里有A的引用。

迭代器模式:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。抽象迭代器A,有访问元素的方法a。抽象容器类,有方法b返回一个A。具体容器类C的方法b返回一个具体迭代器D。D内部存在一个C的引用,用来实现方法a。

责任链模式:让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。抽象处理者类A,内部存在一个类型A的引用successor,有处理方法a。具体处理者类B,继承A,实现a,视情况自己处理或者调用successor的a方法。纯的职责链模式,一环要么处理,要么不处理。不纯的,可以处理并且让别人也处理。

命令模式:请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。具体业务执行类A有方法a。抽象命令类B有方法b。具体命令类C,继承B,内部被注入一个A,方法b内调用A的方法a。用户类D,内部被注入一个B,调用B的方法b。撤销,C内保存一个历史状态。命令队列,增加一个命令队列类E,内部有B的容器类,方法内执行所有B的b。请求日志,C实现Serializable接口,命令执行时,将自己打印出来。恢复时,将打印的C恢复,挨个执行C的b。

备忘录模式:捕获一个对象的内部状态,并在该对象之外保存这个状态,在以后将对象恢复到原先保存的状态。备忘录类A,保存B的属性。普通类B,有createMento方法,返回一个保存B的属性的A,有restore方法,根据参数A,恢复到A保存的状态。备忘录保存类C,内部保存一个或多个A。

状态模式:允许一个对象在其内部状态改变时改变它的行为。抽象状态类A,有方法a。具体方法类B,继承A,实现a。环境类C,内部有一个A的引用,内部方法调用A的a方法。C在方法执行完或者其他地方,改变A的引用,切换成其他状态。

访问者模式:可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

中介者模式:用一个中介对象来封装一系列的对象交互。

解释器模式:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。

注意:本文在编写时参照了Introduction · 设计模式Java版

这位的设计模式博客写的很好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值