算法、设计模式和原则

面试总结

目录

1 设计模式

2 面向对象设计(OOD)原则

开放关闭原则:Open Closed Principle

里氏替代原则:Liskov Substitution Principle

接口隔离原则:Interface Segregation Principle

依赖倒置原则:Dependence Inversion Principle

3 算法

3.1 红黑树

4 C++11新特性


1 设计模式

几种常见的设计模式(含C++代码)_可以更好-CSDN博客_c 设计模式

几种常见的设计模式(含C++代码)

设计模式 | 菜鸟教程

runoob设计模式

本教程将通过 Java 实例,一步一步向您讲解设计模式的概念

2 面向对象设计(OOD)原则

谈谈面向对象设计(OOD)原则 - 简书

谈谈面向对象设计(OOD)原则

--简书,讲的很好

“比设计模式更重要的是设计原则”

面相对象设计的概念大家也都知道,它的设计目标就是希望软件系统能做到以下几点:

  • 可扩展:新特性能够很容易的添加到现有系统中,不会影响原本的东西
  • 可修改:当修改某一部分的代码时,不会影响到其它不相关的部分
  • 可替代:将系统中某部分的代码用其它有相同接口的类替换时,不会影响到现有系统

这几个可以用来检测我们的软件系统是不是设计得合理,而如何设计出易于维护和扩展的软件系统是有设计原则可以遵循指导的,Robert C. Martin提出了面相对象设计的五个基本原则(SOLID):

  • S-单一职责原则
  • O-开放关闭原则
  • L-里氏替换原则
  • I-接口隔离原则
  • D-依赖倒置原则

开放关闭原则:Open Closed Principle

开闭原则的关键在于抽象,我们需要抽象出那些不会变化或者基本不变的东西,这部分东西相对稳定,这也就是对修改关闭的地方(这并不意味着不可以再修改),而对于那些容易变化的部分我们也对其封装,但是这部分是可以动态修改的,这也就是对扩展开发的地方,比如设计模式中的策略模式和模板模式就是在实现这个原则(现在应该对模式有更感性的认识了吧~)。

设计模式之 - 模板模式(Template Pattern) - 韧雪飞舞 - 博客园

设计模式之 - 模板模式(Template Pattern)

模板设计模式在书中定义:

  定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。

  通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

策略模式

转载于https://blog.csdn.net/lh844386434/article/details/16825861

策略模式也是一种非常常用的设计模式,而且也不复杂。下面我们就来看看这种模式。

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

角色:
    抽象策略角色(Strategy): 抽象策略类。
    具体策略角色(ConcreteStrategy):封装了继续相关的算法和行为。
    环境角色(Context):持有一个策略类的引用,最终给客户端调用。

事例: (该事例改编自一道网络设计模式面试题)

     如现在你是一个设计师,你正在设计一种空调。但是你们的空调要支持3种模式。冷风模式(ColdWind), 热风模式(WramWind),无风模式(NoWind)。
当选择ColdWind模式,将输送冷风;当选择WarmWind模式,将输送热风;在选择NoWind模式时,空调什么都不做。你将考虑如何为空调设计应用程序?如果将来空调需要增加支持新的模式呢?

这道面试题,其实可以用各种模式实现,然而在这里我理解策略模式比较合适。我们将冷风模式,和热风模式以及无风模式可以理解为各种不同的算法。显然策略模式非常符合。

这里ColdWind, WramWind, NoWind 其实就是ConcreteStrategy。 IWnd 是抽象策略类。 所以我们开始这么封装我们策略类

里氏替代原则:Liskov Substitution Principle

该原则的定义:所有引用基类的地方必须能透明地使用其子类的对象。简单来说,所有使用基类代码的地方,如果换成子类对象的时候还能够正常运行,则满足这个原则,否则就是继承关系有问题,应该废除两者的继承关系,这个原则可以用来判断我们的对象继承关系是否合理。

通常在设计的时候,我们都会优先采用组合而不是继承,因为继承虽然减少了代码,提高了代码的重用性,但是父类跟子类会有很强的耦合性,破坏了封装。

接口隔离原则:Interface Segregation Principle

该原则的定义:不能强迫用户去依赖那些他们不使用的接口。简单来说就是客户端需要什么接口,就提供给它什么样的接口,其它多余的接口就不要提供,不要让接口变得臃肿,否则当对象一个没有使用的方法被改变了,这个对象也将会受到影响。接口的设计应该遵循最小接口原则,其实这也是高内聚的一种表现,换句话说,使用多个功能单一、高内聚的接口总比使用一个庞大的接口要好。
  举个简单的例子:比如我们有个自行车接口,这个接口包含了很多方法,包括GPS定位,以及换挡的方法

依赖倒置原则:Dependence Inversion Principle

该原则的定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。其实这就是我们经常说的“针对接口编程”,这里的接口就是抽象,我们应该依赖接口,而不是依赖具体的实现来编程。


 

3 算法

3.1 红黑树

红黑树_百度百科

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 [1]

红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 [2]

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 [2]

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

4 C++11新特性

C++11常用新特性汇总_zhanglu_1024的博客-CSDN博客_c++11新特性

C++11常用新特性汇总

5 力扣

力扣题库刷题(随时记录) - fish大叔 - 博客园

力扣题库刷题(随时记录)

力扣

官网

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值