什么是设计模式
一、设计模式
设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码复用性、可维护性、可读性、稳健性以及安全性的解决方案
二、设计模式的意义
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解
三、使用设计模式的优点
1、可以提高程序员的思维能力、编程能力和设计能力
2、使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件开发周期
3、使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。实现高内聚,低耦合!
OOP七大原则
原则分析
后文会对详细的原则进行介绍
这7种原则本质上是程序员在编程时,应当遵守的原则,也是后面的各种设计模式的基础(即:设计模式为什么这么设计的依据)
一、开闭原则OCP:对扩展开放,对修改关闭
就是我们在编写代码的时候,鼓励在原有的功能上扩展业务和功能,抵制改动原本的代码以及新的改动影响原有代码的运行
二、里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
子类可以扩展父类中的方法,但是不能改掉父类中的方法
三、依赖倒置原则:要面向接口编程,不要面向实现编程
抽象不依赖细节,细节依赖抽象。意思就是细节的实现是多变的,要保证接口规范不变,具体的实现依赖于定义的接口
四、单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性
一个对象,不应该承担太多的职责,一个方法就专注干好一件事情(原子性)
五、接口隔离原则:要为各个类建立它们需要的专用接口
对不同的类,创建不同的接口规范,降低类的耦合性,提高内聚性
六、迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话
可以理解成Controller-->Service-->Mapper层,我们不能直接让Controller与Mapper层直接对话,降低程序的耦合
七、合成复用原则:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
单一职责原则
一、单一职责原则
控制类的粒度大小、将对象解耦、提高其内聚性一个对象,不应该承担太多的职责,一个类应该只负责一项职责;一个方法就专注干好一件事情(原子性)
如果A类负责两个不同的职责:职责1,职责2.担当职责1需求变更而改变A类时,可能会造成职责2执行错误,受到影响,所以需要将类A的粒度分解为A1,A2
二、常见的的单一职责案例
比如创建一个交通工具类,交通工具但是分为了地上跑的和天上飞的,
解决方案:
1、将这个交通工具类划分出两种,一种是地上跑的,一种是天上飞的类,这样就能完美解决
2、第二个方案是可以直接在交通工具类中,创建不同的方法,用于处理不同的交通工具使用场景
这个方案虽然是在类上没有遵守单一职责,但是在方法上遵守了这个原则
三、单一职责原则注意事项和细节
1、降低类的复杂度,一个类只负责一项职责
2、提高类的可读性、可维护性
3、降低类变更引起的风险
4、通常情况下,我们应当遵守单一职责原则。只有逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中的方法数量足够少,可以在方法级别保持单一职责原则(类似于上面的案例方案2)
接口隔离原则
一、接口隔离原则
要为各个类建立它们需要的专用接口。对不同的类,创建不同的接口规范,降低类的耦合性,提高内聚性
客户不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上
这个原则应用的场景就是如果一个实现类用不到某个接口中的抽象方法,这个时候可以对这个接口进行拆分,拆分成只够满足实现方法的接口即可
依赖倒置原则
一、了解依赖倒转原则
1、高层模块不应该依赖低层模块,二者都应该依赖其抽象(比如抽象类。接口等等)
2、抽象不应该依赖细节,细节应该依赖抽象
3、依赖倒转的核心思想是面向接口编程
4、依赖倒置原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比细节为基础的架构要稳定的多。在Java中,抽象指的是抽象类或接口,细节指的是具体的实现类
5、使用接口或者抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
二、依赖倒转原则引入
需求:Person类来接收消息
方案一:直接写Email类和Person类,Person类中的参数为Email
方案二:
新建一个接口,创建抽象方法,让Email或者Weixin等发送消息的类实现这个接口
假设增加微信等发送消息方,实现这个接口,直接创建Person类的时候传进这个Weixin类即可
三、依赖关系传递三种方式
1、接口传递
具体的TV直接可以通过创建具体的类来实现这个ITV接口
2、构造方法传递
3、setter方法传递
里氏替换原则
一、理解里氏替换
继承必须确保超类所拥有的性质在子类中仍然成立,子类可以扩展父类中的方法,但是不能改掉父类中的方法,不要重写父类中的方法(重写后将失去了继承的意义)
二、继承关系中可能会存在的问题
子类无意间重写了父类中的方法,造成原有的功能出现了错误。在实际的编程中,我们可能会通过重写父类中的方法完成新的功能,这样写虽然看起来简单,但是整个继承体系的复用性会比较差。特别是在运行 多态的时候
解决方案:
原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉,采用依赖、聚合或者组合(在B类中创建A类的对象,这样就可以调用A类的方法)等关系代替
开闭原则
一、开闭原则概念
开闭原则是编程中最基础、最重要的设计原则
比如说一个类,其中的模块和函数应该对扩展开放(也就是对开发者提供方),对修改关闭(对使用方)。用抽象实现框架,用实现扩展细节
当某一个需求发生了变化,尽量是通过扩展该需求的实现类来实现变化,而不是通过修改已有的代码来实现变化
编程中遵循其他的原则,以及使用设计模式的目的就是遵循开闭原则
迪米特法则
一、什么是迪米特法则
一个对象应该对其他的对象保持最少的了解
迪米特法则又叫最少知道原则。即一个类对自己依赖的类知道的越少越好,也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装到类的内部。对外除了提供public方法,不对外泄露任何的信息。
二、涉及概念
1.直接朋友
每个对象都会和其他的对象产生耦合关系只要是两个对象之间有耦合关系,那么就说这两个对象之间是朋友关系。耦合的方式有很多,依赖、关联、组合、聚合等等,我们称出现在成员变量、方法参数和方法返回值中的类为直接朋友
2、间接朋友
比如某个类作为局部变量出现在了某个类的方法中,那么称这个类是间接朋友
合成复用原则
一、什么是合成复用原则
原则是尽量使用合成/聚合的方式,而不是继承
所谓聚合,相当于现在框架中常见的@AutoWired注解,将某个类注入进来,使其变成一个成员变量
至此,你已经掌握了关于设计模式中重点的七大OOP原则,后续还会持续更新,敬请期待~~~