当前位置:   article > 正文

设计模式面试题整理-四年经验

设计模式面试题

1.开放封闭原则

尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化

2.里氏代换原则

概意思是:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。

优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。

3.依赖倒转原则

依赖倒置原则的核心思想是面向接口编程.

依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,

这个是开放封闭原则的基础,具体内容是:对接口编程,依赖于抽象而不依赖于具体。

4.接口隔离原则

支付类的接口和订单类的接口,需要把这俩个类别的接口变成俩个隔离的接口。

降低依赖,降低耦合,可维护性会更高。

5.单一职责原则

原则思想:一个方法只负责一件事情。

描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。 这是常识,几乎所有程序员都会遵循这个原则。

6.迪米特法则,最少知道原则

原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦。

大概意思就是一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。

III.各种设计模式的运用

1.单例类

保证一个类只有一个实例,并且提供一个访问该全局访问点。

饿汉式:先创建好等着被调用。

懒汉式:要用了再创建实例。

具体运用
  • 网站的计数器,一般也是采用单例模式实现,否则难以同步。
  • 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。
  • 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
  • Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
  • windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
优点
  • 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例
  • 单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
  • 提供了对唯一实例的受控访问。
  • 由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
  • 允许可变数目的实例。
  • 避免对共享资源的多重占用。
缺点
  • 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
  • 可扩展性稍微差了点
  • 违背了单一职责原则

2.工厂模式

它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式。

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

Spring的Ioc控制反转,创建Bean的时候就是工厂模式。

工厂模式分类

简单工厂 :用来生产同一等级结构中的任意产品。(不支持拓展增加产品)
工厂方法 :用来生产同一等级结构中的固定产品。(支持拓展增加产品)
抽象工厂 :用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)

应用

同一个类实例化出不同的产品

3.代理模式

通过代理控制对象的访问,可以在这个对象调用方法之前、调用方法之后去处理/添加新的功能。(也就是AO的P微实现)

代理在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增加新功能,这也和Spring的(面向切面编程)很相似

应用场景

Spring AOP、日志打印、异常处理、事务控制、权限控制等。

4.建造者模式

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方式进行创建。

使用场景:

  • 需要生成的对象具有复杂的内部结构。

  • 需要生成的对象内部属性本身相互依赖。

5.原型模式

原型设计模式简单来说就是克隆

原型表明了有一个样板实例,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

JavaScript大量使用了原型模式

6.观察者模式

先讲什么是行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。

观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

观察者模式应用场景
  • 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。事件多级触发场景。
  • 跨系统的消息交换场景,如消息队列、事件总线的处理机制。
  • Vue的双向绑定,Qt的信号槽,都有用到观察者模式

7.MVC模式

Model是业务模式,View是用户界面,Controller是控制器,三者分开单独管理。

一般的项目中会大量使用这样的设计模式

六、Linux

1.系统初始化的原理

Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2)

idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换。

1号进程由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程。

Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。在系统启动完成完成后,init将变为守护进程监视系统其他进程。

2号进程它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthread的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程

2.进程间通信

Linux进程通信大致有管道、消息队列、共享内存、信号量等等。管道和消息队列很常用。

3.复习常用命令,了解系统维护等等知识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/157543
推荐阅读
相关标签
  

闽ICP备14008679号