c设计模式面试.docx
《c设计模式面试.docx》由会员分享,可在线阅读,更多相关《c设计模式面试.docx(15页珍藏版)》请在冰豆网上搜索。
c设计模式面试
c,,,设计模式,面试
篇一:
八设计模式java面试题
八、设计模式基础知识
1、设计模式及框架定义和作用?
设计模式:
设计模式是一种问题的解决思路,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经
验的总结,它已经适用于一个实践环境,并且可以适用于其它环境。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性,为设计提供共同的词汇,可以节省大量时间,使代码编制真正工程化
框架:
框架是构成一类特定软件可复用设计的一组相互协作的类,框架通常定义了应用体系的整体结构类和对
象的关系等等设计参数。
框架便于具体应用实现者能集中精力于应用本身的特定细节。
框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式
2、开发中都用到了哪些设计模式?
(J2EE常用的设计模式?
)用在什么场合?
答:
singleton:
单例,用来减少垃圾对象和缓存用
factory:
工厂模式,用来解耦(其实模式都用来解耦的)facade和decorator:
封装接口
command:
命令模式,传递Iterator:
用来遍历对象Observer:
用来监听状态变化(现在习惯用listener机制替代)templete:
模板模式,用来处理相同的操作步骤strategy:
策略模式,策略选择
proxy:
用来附加功能,属性或隐蔽。
bridge也很实用,用来解耦工厂与产品搭配之类的选择服务定位者模式,前端控制器模式,DAO模式,代理模式,装饰者模式等
注:
MVC模式准确来说并不是设计模式,而是架构。
详解如下:
MVC模式是一个复杂的架构模式,其实现也显得非常复杂。
但是,我们已经总结出了很多可靠的设计模式,多种设计模式结合在一起,使MVC模式的实现变得相对简单易行。
Views可以看作一棵树,显然可以用CompositePattern(合成模式)来实现。
Views和Models之间的关系可以用ObserverPattern(观察者模式)体现。
Controller控制Views的显示,可以用StrategyPattern(策略模式)实现。
Model通常是一个调停者,可采用MediatorPattern来实现。
|合成模式:
装饰模式、享元模式、迭代子模式、访问者模式
|策略模式:
享元模式
|观察者模式:
调停模式、单例模式
以下是部分设计模式详解
工厂模式:
专门负责将大量有共同接口的类实例化。
工厂模式可以动态确定将那一个类实例化,不必事先知道每
次要实例化哪一个类。
简单工厂模式:
或称静态工厂方法模式。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单
工厂模式就是由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色:
a工厂类角色:
含有与应用紧密相关的商业逻辑。
工厂类在客户端的直接调用下创建产品对象。
b抽象产品角色:
担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
c具体产品角色:
工厂方法模式所创建的任何对象都是这个角色的实例。
优点是:
允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端。
缺点是:
如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。
工厂方法模式:
或称多态性工厂模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工
作推迟到子类中。
工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。
它仅负责给出具体工厂子类必须实现的接口。
这样可以用来允许系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式涉及到的角色:
a抽象工厂角色:
它不包含应用逻辑。
任何在模式中创建对象的工厂类必须实现这个接口。
b具体工厂角色:
含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
c抽象产品角色:
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
d具体产品角色:
这个角色实现了抽象产品角色所声明的接口。
单例模式:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
特点:
单例类只能有一个
实例;单例类必须自己创建自己的惟一的实例;单例类必须给所有其他对象提供这一实例。
多例模式:
多例类可以有多个实例,并且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
在
系统中可以用于数据库连接池、键值缓存等。
代理模式:
给某个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式所涉及的角色:
抽象主
题角色:
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题角色。
39
篇二:
C语言设计模式
目录
语言设计模式(开篇).........................................................................................2
语言和设计模式(继承、封装、多态).............................................................3
继承性..............................................................................................................3
封装性..............................................................................................................4
多态..................................................................................................................4
3.单件模式....................................................................................................................4
4.工厂模式....................................................................................................................5
5.抽象工厂模式............................................................................................................6
6.访问者模式................................................................................................................8
7.状态模式....................................................................................................................9
8.命令模式....................................................................................................................9
9.解释器模式..............................................................................................................10
10.备忘录模式............................................................................................................11
11.观察者模式............................................................................................................12
12.桥接模式................................................................................................................12
13.建造者模式............................................................................................................13
14.中介者模式............................................................................................................14
15.策略模式................................................................................................................15
16.适配器模式............................................................................................................16
17.装饰模式................................................................................................................17
18.亨元模式................................................................................................................17
19.代理模式................................................................................................................18
20.外观模式................................................................................................................19
21.迭代器模式............................................................................................................20
22.责任链模式............................................................................................................21
23.模版模式.............................................................................................................22
24.组合模式................................................................................................................24
25.原型模式................................................................................................................25
语言设计模式(开篇)
关于软件设计方面的书很多,比如《重构》,比如《设计模式》。
至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。
随着时间的推移,很多的方法又会被重新提出来。
其实,就我个人看来,不管什么方法都离不开人。
一个人写不出二叉树,你怎么让他写?
敏捷吗?
你写一行,我写一行。
还是迭代?
写三行,删掉两行,再写三行。
项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混乱、设计低劣、代码质量差、测试不到位等等。
就软件企业而言,没有比优秀的文化和出色的企业人才更重要的了。
从软件设计层面来说,一般来说主要包括三个方面:
(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;
(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;
(3)软件编写模式,比如装饰模式、责任链、单件模式等等。
从某种意义上说,设计思想构成了软件的主题。
软件原则是我们在开发中的必须遵循的准绳。
软件编写模式是开发过程中的重要经验总结。
灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。
毕竟对于广大的软件开发者来说,软件的维护时间要比软件编写的时间要多得多。
编写过程中,难免要有新的需求,要和别的模块打交道,要对已有的代码进行复用,那么这时候设计模式就派上了用场。
我们讨论的主题其实就是设计模式。
讲到设计模式,人们首先想到的语言就是c#或者是java,最不济也是c++,一般来说没有人会考虑到c语言。
其实,我认为设计模式就是一种基本思想,过度美化或者神化其实没有必要。
其实阅读过linuxkernel的朋友都知道,linux虽然自身支持很多的文件系统,但是linux自身很好地把这些系统的基本操作都抽象出来了,成为了基本的虚拟文件系统。
举个例子来说,现在让你写一个音乐播放器,但是要支持的文件格式很多,什么ogg,wav,mp3啊,统统要支持。
这时候,你会怎么编写呢?
如果用C++语言,你可能会这么写。
classmusic_file
{
HANDLEhFile;
public:
voidmusic_file(){}
virtual~music_file(){}
virtualvoidread_file(){}
virtualvoidplay(){}
virtualvoidstop(){}
virtualvoidback(){}
virtualvoidfront(){}
virtualvoidup(){}
virtualvoiddown(){}
};
其实,你想想看,如果用C语言能够完成相同的抽象操作,那不是效果一样的吗?
typedefstruct_music_file
{
HANDLEhFile;
void(*read_file)(struct_music_file*pMusicFile);
void(*play)(struct_music_file*pMusicFile);
void(*stop)(struct_music_file*pMusicFile);
void(*back)(struct_music_file*pMusicFile);
void(*front)(struct_music_file*pMusicFile);
void(*down)(struct_music_file*pMusicFile);
void(*up)(struct_music_file*pMusicFile);
}music_file;
当然,上面的例子比较简单,但是也能说明一些问题。
写这篇文章的目的一是希望和朋友们共同学习模式的相关内容,另一方面也希望朋友们能够活学活用,既不要迷信权威,也不要妄自菲薄。
只要付出努力,付出汗水,肯定会有收获的。
有些大环境你改变不了,那就从改变自己开始。
万丈高楼平地起,一步一个脚印才能真真实实学到东西。
如果盲目崇拜,言必google、微软、apple,那么除了带来几个唾沫星,还能有什么受用呢?
无非白费了口舌而已。
希望和大家共勉。
语言和设计模式(继承、封装、多态)
记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。
C++有三个最重要的特点,即继承、封装、多态。
等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。
可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?
等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。
继承性
typedefstruct_parent
{
intdata_parent;
}Parent;
typedefstruct_Child{
struct_parentparent;
intdata_child;
}Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。
这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
封装性
struct_Data;
typedefvoid(*process)(struct_Data*pData);
typedefstruct_Data
{
intvalue;
processpProcess;
}Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。
这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。
封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
多态
3.单件模式
有过面试经验的朋友,或者对设计模式有点熟悉的朋友,都会对单件模式不陌生。
对很多面试官而言,单件模式更是他们面试的保留项目。
其实,我倒认为,单件模式算不上什么设计模式。
最多也就是个技巧。
单件模式要是用C++写,一般这么写。
#include
#include
classobject
{
public:
staticclassobject*pObject;
staticobject*create_new_object()
{
if(NULL!
=pObject)
returnpObject;
pObject=newobject();
assert(NULL!
=pObject);
returnpObject;
}
private:
object(){}
~object(){}
};
classobject*object:
:
pObject=NULL;
单件模式的技巧就在于类的构造函数是一个私有的函数。
但是类的构造函数又是必须创建的?
怎么办呢?
那就只有动用static函数了。
我们看到static里面调用了构造函数,就是这么简单。
intmain(intargc,char*argv[])
{
object*pGlobal=object:
:
create_new_object();
return1;
}
4.工厂模式
工厂模式是比较简单,也是比较好用的一种方式。
根本上说,工厂模式的目的就根据不同的要求输出不同的产品。
比如说吧,有一个生产鞋子的工厂,它能生产皮鞋,也能生产胶鞋。
如果用代码设计,应该怎么做呢?
typedefstruct_Shoe
{
inttype;
void(*print_shoe)(struct_Shoe*);
}Shoe;
就像上面说的,现在有胶鞋,那也有皮鞋,我们该怎么做呢?
voidprint_leather_shoe(struct_Shoe*pShoe)
{
assert(NULL!
=pShoe);
printf("Thisisaleathershow!
\n");
}
voidprint_rubber_shoe(struct_Shoe*pShoe)
{
assert(NULL!
=pShoe);
printf("Thisisarubbershoe!
\n");
}
所以,对于一个工厂来说,创建什么样的鞋子,就看我们输入的参数是什么?
至于结果,
篇三:
公司系统设计面试
系统设计试题
一.选择题
1.下列UML类图表示的是
(1)A.备忘录(Memento)B.策略(Strategy)
C.状态(Stye)D.观察者(Observer)
2.接上题:
该设计模式中,。
A.一个Subiect对象可对应多个Observer对象B.Subiect只能有一个ConcreteSubject子类C.Observer只能有一个ConcreteObserver子类
D.一个Subiect对象必须至少对应一个Observer对象
3.网络安全体系设计可从物理线路安全、网络安全、系统安全