问: 简述一下代码设计的六大原则.
-
开闭原则
-
里氏替换原则
-
单一职责原则
-
开放-封闭原则
-
依赖倒置原则
-
迪米特法则
简述一下设计模式的分类.
- 创建型模式: 单例模式, 工厂模式, 抽象工厂模式, 建造者模式, 原型模式
- 结构型模式: 适配器模式, 桥接模式, 组合模式, 装饰模式, 外观模式, 享元模式, 代理模式
- 行为型模式: 访问者模式, 模版模式, 策略模式, 状态模式, 观察者模式, 备忘录模式, 中介者模式, 迭代器模式, 解释器模式, 命令模式, 责任链模式
简述一下简单工厂模式.
简单工厂模式常常需要和多态配合使用,通过面向对象的多态特性来创建不同的具体子类,最后通过工厂类对象来实例化不同对象.
但是简单工厂模式的缺点也是很明显的,就是当需要新增一个产品的时候,需要修改工厂类的内部代码,违背了开闭原则
.
简述一下工厂方法模式.
为了解决简单工厂模式的缺点,所以就有了工厂方法模式.
工厂方法模式相对于简单工厂模式,工厂方法模式提供了一个工厂接口类,让子类去实现这个接口类,然后可以完美遵循 开闭原则
. 每当有一个新的产品时,我们就创建一个新的工厂类继承于工厂接口类,这样就不用再去修改工厂类的代码了.
简述一下抽象工厂模式.
不管是简单工厂模式还是工厂方法模式,都只能创建一个产品,也就是上图中的抽象类只有一个,如果我们需要多个产品,这时候就需要用到抽象工厂模式了.
简述一下单例模式.
当我们全局只需要维护一个对象的时候,这时候我们就需要使用单例模式,常常用于工具类的创建使用.
示意图如下所示.
简述一下建造者模式.
建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,用户使用不同的具体建造者就可以得到不同的对象.
比如,我们需要创建一个人,这个人有很多属性,比如: 姓名,年龄,性别,身高,体重,头发颜色,眼睛颜色等等,这时候我们就可以使用建造者模式来创建这个人. 通过建造者模式,我们可以创建出不同的人,比如: 一个胖子,一个瘦子,一个高个子,一个矮个子等等.
简述一下原型模式.
原型模式是用于创建重复对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.
简述一下适配器模式.
适配器模式主要新旧系统对接时使用的模式,当新系统需要旧系统的支持,但是接口又不满足新系统需求时,这时候就需要一个适配器来做中间者.
简述一下桥接模式.
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立的变化.
举例说明,我们有一个手机类,手机类有很多属性,比如: 品牌,颜色,价格等等,这时候我们就可以使用桥接模式来创建这个手机类.
简述一下装饰器模式.
装饰器模式是在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案.
简述一下外观模式.
外观模式会有一个外观类,这个外观类会组合多个子类的相关功能,然后供外部调用.
简述一下享元模式.
享元模式基本思路就是和它的名字一样,享元,就是共享的意思,享元模式就是共享对象的意思,它通过共享实例对象,来减少内存的使用.我们通常使用维护一个池来存储对象,当需要使用对象时,先从池中取出,如果池中没有,就创建一个新的对象,然后放入池中,当需要销毁对象时,不是真的销毁,而是将对象放入池中.
示意图如下所示.
简述一下代理模式.
代理模式需要三个角色,分别是: 外部调用者,代理类,被代理者. 其中,外部调用者是调用被代理者,被代理者指派代理类来执行任务,代理类负责执行被代理者的任务.
iOS中的代理模式,我们经常使用的就是UITableView
和UICollectionView
的代理模式,我们可以通过代理模式来实现UITableView
和UICollectionView
的数据源和代理方法.
示意图如下所示.
简述一下责任链模式.
责任链模式是将请求的发送者和接收者解耦,让多个对象都有机会处理这个请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
责任链模式让我感觉和状态模式很像,不过一个是状态模式是状态可直接进行切换,一个是责任链模式是整个链路依次执行.
示意图如下所示.
简述一下命令模式.
命令模式主要有这样几个角色: 命令发送者, 命令接收者, 命令执行者, 命令.
当命令发出者需要执行命令时,会将命令发送给命令接收者. 命令接受者持有不同的命令.
然后通过命令内部函数调用命令执行者执行具体的事务, 完成整个流程的执行.
示意图如下所示.
简述一下解释器模式.
解释器模式是指给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.
常见的解释器应用例如: 正则表达式, SQL语句等等.
示意图如下所示.
简述一下迭代器模式.
迭代器模式是比较常见的模式,它是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示.
例如,我们有一个数组,我们想要遍历这个数组,我们可以使用for
循环,也可以使用while
循环,但是这样的话,我们就需要知道数组的长度,这样就暴露了数组的内部实现.
但是如果我们使用迭代器模式,我们就不需要知道数组的长度,我们只需要知道数组的第一个元素,然后调用next
方法,就可以获取下一个元素,直到获取到nil
为止.
示意图如下所示.
简述一下中介者模式.
当多个系统需要相互通信时,如果每一个系统都需要知道其他系统的存在,那么就会导致系统之间的耦合度非常高,非常不利于后期的维护与迭代.
这时候,我们就需要使用迭代器模式,将系统之间的通信进行解耦,让系统之间的通信通过中介者完成.这样,系统之间的通信就不会相互影响,也不会相互依赖.
每一个系统只需要提供对应的外部接口和知道中介者的存在即可.
示意图如下所示. 通信流转可以查看不同颜色的箭头.
简述一下备忘录模式.
备忘录模式是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态.
备忘录模式的使用场景有: 保存游戏进度,保存编辑器的状态等等.
备忘录模式的实现,我们可以使用NSCoding
协议来实现.
示意图如下所示.
简述一下观察者模式.
观察者模式是指定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.
观察者模式的使用场景有: 通知中心, KVO等,以及现在的MVVM. 还有就是前端的Vue.js的双向绑定等等.
示意图如下所示.
简述一下状态模式.
状态模式是指允许一个对象在其内部状态改变时改变它的行为,这个对象看起来像是改变了它的类.
状态模式的使用场景有: 电梯的状态, 人的心情状态等等.
状态模式和责任链模式的区别是: 状态模式是状态可直接进行切换,责任链模式是整个链路依次执行.
示意图如下所示.
简述一下策略模式.
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,此模式让算法的变化独立于使用算法的客户.
策略模式一定程度上遵循了开闭原则,当我们需要增加新的算法时,只需要增加新的算法类,不需要修改原有的代码.
示意图如下所示.
简述一下模板方法模式.
模版方法模式主要是为了防止子类重写父类的方法,导致父类的逻辑被破坏.
模版方法模式会将父类的方法设置为final
,这样就可以防止子类重写父类的方法.
并且,模版方法模式会将父类的方法分为两部分,一部分是抽象方法,一部分是具体方法,抽象方法由子类实现,具体方法由父类实现.
示意图如下所示.
简述一下访问者模式.
访问者模式应该算是一种比较复杂的设计模式了,它的主要作用是将数据结构与数据操作分离.
访问者模式的使用场景有: Java中的Visitor
模式, 以及前端的Visitor
模式.
访问者模式常用于数据结构比较稳定的系统中,因为访问者模式要求数据结构和作用于结构上的操作是相互独立的,如果数据结构经常变化,那么就需要频繁的修改访问者类,这样就会导致访问者类频繁的变化,维护起来非常麻烦.
示意图如下所示. 流程调用可以查看不同颜色的箭头.
Comments | 0 条评论