设计模式的原则
开闭原则
对扩展开放,对修改封闭
在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果,使程序的扩展性好,易于维护和升级。
单一职责原则
每个类只实现单一的职责
依赖倒转原则
面向接口编程,依赖于抽象而不依赖于具体
写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
接口隔离原则
接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加轻便灵活。使用多个隔离的接口,比使用单个接口要好,降低接口之间的耦合度与依赖,方便升级和维护方便。
里氏替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能
里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,反之不然。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
迪米特法则(最少知道原则)
高内聚,低耦合
一个类对于其他类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。狭义的迪米特法则
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
合成复用原则
首先考虑作为成员变量来调用另一个类的方式,而不是使用继承。
设计模式
创建模式
抽象工厂模式
抽象工厂模式定义了生成一系列对象的方法,而不是指定类型的对象。它使应用程序能够和框架的具体实现进行解耦。例如BeanFactory
工厂模式
生成固定类型对象的工厂。
建造者模式
通过定义一个类来简化复杂对象的创建,该类的目的是构建另一个类的实例。构建器模式还允许实现Fluent接口。
原型模式
使类的实例能够生成自身的拷贝。如果需要大量类实例,复杂且耗时,则可以使用这种模式,而不重新创建新的实例,如Cloneable
单例模式
类只有一个实例。
结构模式
适配器模式
常用于将一个新接口适配旧接口,成为两个不兼容接口之间的桥梁,它结合了两个独立接口的功能。
桥接模式:
将抽象和抽象实现进行解耦,这样可以使得抽象和抽象实现可以独立进行变化,解决子类拥有多维度问题。
组合模式
让客户端看起来在处理单个对象和对象集合是平等的,例如多级菜单、公司组织架构。
装饰者模式
动态的给一个对象附加额外的功能,因此它也是子类化的一种替代方法。
门面模式
为一组组件,接口,抽象或子系统提供简化的接口。例如SLFJ日志,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
享元模式
使用缓存来减少对小对象的访问时间。
代理模式
代理模式又叫委托模式,为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理模式通俗来讲就是我们生活中常见的中介。
行为模式
责任链
通过把请求从一个对象传递到链条中下一个对象的方式来解除对象之间的耦合,直到请求被处理完毕。链中的对象是同一接口或抽象类的不同实现,例如Spring入参解析器。
命令模式
将命令包装在对象中,以便可以将其存储,传递到方法中,并像任何其他对象一样返回,例如Activiti工作流。
解释器模式
此模式通常描述为该语言定义语法并使用该语法来解释该格式的语句。
迭代器模式
提供一个统一的方式来访问集合中的对象。
中介者模式
通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖,例如MQ。
备忘录模式
生成对象状态的一个快照,以便对象可以恢复原始状态而不用暴露自身的内容。比如Date对象通过自身内部的一个long值来实现备忘录模式。
空对象模式
允许抽象空对象的处理。
观察者模式
为组件提供一种灵活地向关注的接收者广播消息的方式。例如MQ,XXLJob,ApplicationListener,注册中心。
状态模式
在运行时根据内部状态更改对象的行为,例如订单状态。
策略模式
将一组算法封装成一系列对象,通过调用这些对象可以灵活的改变程序的功能。
模板方法模式
让子类可以重写方法的一部分,而不是整个重写。
访问者模式
提供一个方便的可维护的方式来操作一组对象,在不改变操作的对象前提下,可以修改或者扩展对象的行为。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。