设计模式总结

面向对象基础

1、抽象

这个是所有的面向对象书籍都会提到的,但很难描述它,的确很“抽象”。我的理解是对现实问题通过面向对象方式建模的过程就是“抽象”。

2、封装

1、封装最直接的意思就是隐藏内部细节,减少暴露,让客户代码不用关心类的内部实现。
2、封装还分几个方面,封装(对象创建,方法调用,复杂接口、算法等等),下面提到的各种设计模式本质上就是“封装变化”

3、多态

多态就是指在运行时客户代码对同一个调用产生多个不同行为。关键是运行时而不是编译时决定的。又叫动态绑定,后期绑定。

4、继承

很简单,实现复用的一个基本方式,子类拥有父类的所有方法和属性。

面向对象基本特性

1、可复用

正例:复用代码,复用设计,复用经验,复用类,复用的反面就是重复造轮子。
反例:代码不能复用还带来重复代码太多,导致难以维护。

2、可扩展

软件设计一定是面向“变化”的,需求变化是常有的事,增加新的特性。
反例:无法扩展,不易扩展,每一个需求变化都会导致重新设计、重新编码,导致重复劳动

3、可维护

准确的说所有的软件系统都要是可维护的,维护软件的是“人”,可维护的意思就是软件是写给“人”看的,以后让“人”来修改、重构它的。
反例:每一次需求变更都会“牵一发动全身”。

面向对象设计基本原则

1、封装变化(隔离变化)

在设计决策的时候,除了要应对目前的需求,还要考虑未来可能的变化,把容易变化的部分“隔离”出来,通过设计模式来灵活的应对未来需求的变化。

2、多用组合少用继承

反例:继承的缺点就是子类拥有父类所有的东西,不管你要不要,尤其是当父类变更的时候,这些变更会“体现”在所有的子类,这对代码的可能风险带来很大问题。
正例:设计抽象类(接口)来继承,不要继承一个具体类。

组合是一种相识关系,耦合度比较低。

3、针对接口编程,不针对实现编程

我们所说的接口,不仅仅指interface,还包括抽象类。说白了,所有的对象引用都应该是接口,而不是一个具体类。
正例:接口可以有多个实现,只要接口不变,实现可以替换,但如果强依赖实现,就导致代码无法扩展

4、低耦合高内聚

耦合就是依赖,一句话,类之间能不依赖,就不要依赖(现实是不可能做到的)
反例:依赖导致每次变更都要测试相关类
正例:依赖倒置原则,即使依赖,也不要依赖具体类,高层和底层都依赖接口(抽象)。

5、开闭原则

这是应对变化的一条基本原则,代码应该是对扩展开放对修改封闭。扩展类的行为不应该通过修改已有代码实现,而应该通过继承、组合、各种设计模式实现。
反例:对原有代码的改变总会带来不可预知的风险和测试成本。

6、单一职责

只有一个原因引起类的状态变化。说白了就是一个类只做一件事,这个原则和高内聚原则一起来看,一个类不仅要只做一件事,还要是一些“相关”的事。

7、里氏替换原则

所有出现基类的地方都可以用子类替换

8、依赖倒置原则

高层模块不依赖于低层模块,两种都依赖抽象,抽象不应该依赖细节,细节应该依赖抽象。所谓“倒”,是相对于传统过程式设计而言。

9、接口隔离原则

不要强迫客户代码依赖他们不用的方法。

逆向思维–拙劣的设计

在这里插入图片描述

设计模式

设计模式是什么

我们周围不断重复发生的问题,以及该问题解决方案的核心。说白了,就是设计经验的总结。
主要包括4个要素
模式名称、问题、解决方案、效果

设计模式如何解决设计问题

1、寻找合适的对象
在这里插入图片描述
2、决定对象的粒度
3、指定对象的接口
对象的接口指对象的类型(type),是对象操作的集合。你能向对象发起哪些请求。
4、描述对象的实现
对象的实现是通过类(class)完成的。一定要区别对象的类型(type)

常用设计模式

在这里插入图片描述

一、创建型

如何创建对象
1、工厂方法
类的实例化延迟到子类,在子类中决定实例化哪个具体类
2、抽象工厂
多个产品的组合生产,简化客户代码生成大对象
3、生成器
对象的各个部分有类似可选部分和必填部分。可以部分创建对象。按需创建对象的可选部分。把对象的整个创建过程分解了。
4、单例
只有一个类实例

二、结构型

把类和对象组合获得更大的结构(类)
1、适配器
两个已有类接口无法兼容,通过适配器来达到兼容的目的。
2、组合
类似树形机构,对客户代码不用区分整体和部分(子树还是叶子节点,目录还是文件。。。)
3、装饰者
俄罗斯套娃,给类添加新的行为的方式
4、外观
减少客户代码和子系统的接口调用,提供一个或一些统一的接口给客户代码。
5、代理
客户代码通过代理对象访问目标对象,在代理对象中可以增加一些新的行为。和切面编程思路类似。

三、行为型

算法和对象间职责的分配(操作类的)
1、责任链
一个请求和多个处理请求的接受者。形成链条,直到链上的一个接受者响应请求为止。
2、命令
把请求封装成命令对象,命令对象提供执行和撤销。例如把请求序列记录到日志,系统崩溃恢复后再执行命令。实现事务。
3、迭代器
对集合元素的遍历
4、观察者
和回调类似,消息队列类似,观察者注册对某一个主题的订阅,当主题(subject)状态变化时,通知所有观察者。MVC就是一个例子。
5、状态
对象的行为依赖状态的改变,类似状态机。例如同一个操作(operate),在关闭的状态行为就是“打开”, 在打开的状态行为就是“关闭”。当然复杂的状态机可能有很多个状态,状态之间不停的切换。
6、策略
封装一组算法,可以相互替代。
7、模板方法
把算法的“骨架”实现在抽象类,部分算法的步骤可以有子类实现。

总结

设计的3个常用层面

应用程序——》工具集——》框架,设计难度递增。

经验

1、代码越通用越灵活越需要设计模式,难度最大的就是框架设计。
2、设计模式应对“变化”的武器
3、设计模式是避免每次都“特殊”处理的武器
4、每一个设计决策都需要在设计原则和设计模式中找到方法论依据
5、除非找出足够合理的理由,否则设计原则是不应该被破坏的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值