设计模式
设计模式六大原则
SOLID:
Single Responsibitity Principle 单一职责原则
Open Close Principle 开放封闭原则
Liskov Substitution Principle 里氏替换原则
Interface Segregation Principle 接口分离原则
Dependence Inversion Principle 依赖倒置原则
Least Knowledge Principle 迪米特法则
开闭原则(核心原则)
开闭原则规定软件中的对象、类、模块和函数对扩展应该时开放的,但是对于修改时封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性。开闭原则就是三个顶层的代码设计思维:
抽象意识
封装意识
扩展意识
关键字:实现只添加代码,不修改代码的设计,最典型的就是策略模式以及工厂模式
优点:
新老逻辑解耦,需求发生变化时不会影响老业务
改动成本最小,只需要增加逻辑
提供代码的稳定性与可扩展性
示例:
系统A与系统B之间数据传输时,约定协议时,要考虑协议的可以变性,抽取具有报文编译、编制、校验等所有版本协议使用的通用方法,面向接口开发。当出现新的协议时,可以在不更改代码的情况下增加新的协议实现。
单一职责原则
一个类或者模块只负责完成一个职责。一个类只负责完成一个职责或者功能,在也就是说,在设计类时,不要设计大而全的类,而是要设计力度小、功能单一的类。
关键词: 职责单一
例如:
实体对象/表 的设计中有与主体关联性弱的信息,这类需要根据实际的业务场景信息进行拆分,如果某些字段的信息有可能发生扩展,且扩展内容与主体有可能关联性弱,这类字段就应该单独提取出来。比如,UserInfo中的地址信息,如果地址信息后期有可能发生扩展、修改,那么该信息就应该单独提取出表。
接口的设计,接口是否只能有一个功能
如何判断一个类的职责是否单一:
类的代码行数、函数、属性过多
类以来的类过多
类的四方方法过多
类中的大量方法总是操作类中的几个属性
接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上。每一个接口应该承担独立的角色,不敢不该自己干的事,避免子类实现不需要的接口方法,需要对客户提供接口的时候,只需要暴露最小的接口。
关键字:接口职责单一
优势:
将庞大臃肿的接口分为多个细粒度的接口,可以提高系统的灵活性和可维护性
使用多个专门的接口,还能够体现出对象的层次
能够减少项目工程中的冗余代码
示例:
比如接口
Flyable
和Runnable
两个接口,不可以合二为一在JUC中,Executor 与 ExecutorService,Executor只提供一个execute方法,剩余的有子接口 ExecutorService进行功能扩展,就很好的遵守了接口隔离原则。备注: 如果是符合接口隔离原则的组合的Interface,在理解Interface时,将接口名单词拆分更好理解,以ExecutorService为例,可以拆分为Executor + Service,前者代表继承Executor接口,拥有执行的能力,后者则代表提供一系列服务的方法。
Runnable、Future 以及他们的组合接口 RunnableFuture
里氏替换原则
简单来说,就是一个方法的参数假设是一个接口,那么这个方法可以处理所有这个接口的实现类,方法中不应该有特殊操作。并且是接口的哪儿种派生类的实现,都与接口或者积累方法的期望行为一致。
以下代码既符合开闭原则,也符合里氏替换原则:
依赖倒置原则
依赖接口,不要依赖接口具体的实现。
迪米特法则(最少知道原则)
指一个类/模块对其他的类/模块有越少的了解越少。典型的迪米特法则的设计模式有适配器模式。通过中间人,降低类之间、模块之间的耦合性。
不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。
设计模式分类
创建型模式
Simple Factory
,简单工厂,使用一个简单的标记获取这个标记对应的类实例。Factory Method
,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。Abstract Factory
,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
结构型模式
共享池:
扩展对象的功能:
处理复杂对象关系:
行为型模式
Observer
,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。PubSub
,发布订阅模式
状态迁移表示法。
State
,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
行为抽象暴露:
模板行为抽象暴露:
Chain of Responsibility
,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系Mediator
,中介者模式:用一个中介对象封装一些列的对象交互。Visitor
,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
最后更新于
这有帮助吗?