面向对象复习提纲.docx
- 文档编号:27482534
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:23
- 大小:454.86KB
面向对象复习提纲.docx
《面向对象复习提纲.docx》由会员分享,可在线阅读,更多相关《面向对象复习提纲.docx(23页珍藏版)》请在冰豆网上搜索。
面向对象复习提纲
c一、复习提纲(填空,判断,选择)
1.UML的基本概念、名称、历史、和UML2.0规范的结构和13种图以及所属类型。
以及每种图的所属描述软件特征的类型。
·名称:
UnifiedModelingLanguage,统一建模语言
·基本概念:
用图形符号来表达面向对象设计
·历史:
·13种UML图及其反映的软件特征的类型:
功能:
用例图
结构:
类图、对象图、包图、复合结构图
行为:
状态机图、顺序图、活动图、通讯图、交互概观图
实现:
构建图、部署图
时间:
定时图
2.软件过程的几个阶段
需求分析设计实现测试维护
3.MVC的概念
Model模型,View视图、Controller控制器
4.面向对象中对象和对象之间的关系:
组合(委托)、继承(公有继承、私有继承),以及他们的实现机制
委托:
转发对自身的请求给组合(或聚合)对象,组合和委托的一般实现:
classBrain{
public:
voidfun1();
};
classPerson{
private:
Brainb;//这是组合
public:
voidfun1(){b.fun1();}//这是委托
};
组合和私有继承实现的是has-a关系(A包含/私有继承B,则B是A的成员/基类子对象)
公有继承实现的是is-a关系(A公有继承B,则A是B的子类型)
5.抽象类的作用
在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。
抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
6.支持多视感标准的抽象工厂(AbstractFactory)模式,GUIFactory的创建特点,以及如何根据用户输入不同,建立多视感标准。
·GUIFactory类:
·抽象产品类和具体子类:
·GUIFactory的创建特点:
1.GuiFactory实例可以是全局变量、一个众所周知的类的静态成员,或者如果整个用户界面是在一个类或一个函数中创建的,则可以是局部变量,此时一般用Singleton来创建。
2.GUIFactory实例在用来创建窗口组件之前、所需视感标准确定之后创建。
·依据用户输入不同,建立多视感标准:
GUIFactory*guiFactory;
constchar*styleName=getenv(“LOOK_AND_FEEL”);//用户的输入,比如环境变量之类的
if(strcmp(styleName,“Motif”)==0){
guiFactory=newMotifFactory;
}
elseif(strcmp(styleName,“Presentation_Manager”)==0){
guiFactory=newPMFactory;
}
else{
guiFactory=newDefaultGUIFactory;
}
7.框架和设计模式的关系
·相同点:
都是对已有的代码或者模式的重用
·不同点:
1.设计模式比框架更抽象。
框架可以用代码来表示,而设计模式只有其实例才能表示为代码。
框架能够被直接执行和复用,设计模式复用时,需要被实现。
2.设计模式是比框架更小的体系结构元素。
一个典型的框架包含了多个设计模式。
3.框架比模式更加特征化,框架总是针对一个特定的应用领域,而模式主要用于解决某一类问题。
8.Decorator模式下图元和边框,滑动条的关系
9.我们讲的几个典型模式的意图
·Adapter适配器:
将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
·Façade外观:
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
·Flyweight享元:
运用共享技术有效地支持大量细粒度的对象。
·ChainofResponsibility职责链:
为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
·Proxy代理:
为其他对象提供一个代理以控制对这个对象的访问。
10.几个典型模式的实现方式
·Façade外观:
·Flyweight享元:
·ChainofResponsibility职责链:
·Adapter中的类适配器:
·Adapter中的对象适配器:
·Proxy代理:
11.动态绑定和多态
·多态:
同样的消息被不同类型的对象接收时导致不同的行为。
·动态绑定:
C++中的虚函数(用virtual声明),将函数调用绑定到具体函数的过程是在程序运行阶段动态确定的,叫做动态绑定。
12.设计模式中,继承和组合与复用的关系
·继承的优点:
新类易实现、易修改或扩展。
·继承的缺点:
继承复用破环包装,白箱复用;超类发生变化,子类不得不改变;继承的实现是静态的,不能在运行时改变。
·组合的优点:
新对象存取成分对象的唯一方法是通过成分对象的接口;黑箱复用,因为成分对象的内部细节是新对象所看不见的;支持包装;所需的依赖较少;每一个新的类可以将焦点集中在一个任务上;这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象;作为复用手段可以应用到几乎任何环境中去。
·组合的缺点:
系统中会有较多的对象需要管理。
·优先采取组合复用的方式,可以在运行时动态配置组件的功能,并防止类层次规模的爆炸性增长。
13.设计模式的概念、要素、实现方式
·概念:
设计模式是用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。
·要素:
模式名称、问题、解决方案、效果
·实现方式:
基于面向对象的语言实现
14.设计模式中Lexi文本编辑器中文档结构和Composite模式的概念
Composite(组合)模式:
将对象组合成树形结构以表示“部分-整体”的层次结构。
它使得客户对单个对象和复合对象的使用具有一致性。
15.各种设计模式的分类
·创建型:
AbstractFactory抽象工厂、Builder生成器、FactoryMethod工厂方法(或称SimpleFactory简单工厂)、Prototype原型、Singleton单体
·结构型:
Adapter适配器、Bridge桥接、Composite组合、Decorator装饰、Façade外观、Flyweight享元、Proxy代理
·行为型:
ChainofResponsibility职责链、Command命令、Interpreter解释器、Iterator迭代、Mediator中介者、Memento备忘录、Observer观察者、State状态、Strategy策略、TemplateMethod模版方法、Visitor访问者
16.看图识别模式,一些经典课程讲义中的图片例子
设计模式的典型图片见10,以下举几个书上的典型例子
·Composite例子:
见14的Glyph类
·Strategy例子:
·Decorator例子:
见8的MonoGlyph类
·AbstractFactory例子:
见6的GUIFactory类
·Bridge例子:
·Command例子:
·Iterator例子:
·Proxy例子:
·Façade例子:
17.链表的插入内容
·单链表的插入:
p
Node
p->Next()=q;
·双向链表的插入:
注意:
其中有些步骤可以交换次序,由于情况多样,无法一一列举,考试时视具体情况而定。
原则是不能出现节点自己到自己的自循环。
二、复习提纲(分析、程序填空、问答、编程)
1.UML的用例图要会画
·自动售货机的UML用例图:
2.Singleton模式要会
classSingleton{
public:
staticSingleton*Instance(){
if(_instance==0)_instance=newSingleton();
return_instance;
}
protected:
Singleton(){}
private:
Singleton*_instance;
};
3.私有继承和对象组合的异同(举例说明)
·在Adapter模式中,私有继承可以形成类适配器,组合可以形成对象适配器。
无论何种适配器,Adaptee都是Adapter的子对象,Adapter都实现了接口转换,并都可以添加新功能。
·类适配器:
1.匹配一个类及所有它的子类时,类Adapter将不能胜任工作。
2.Adapter可以重定义Adaptee的部分行为。
3.不需要额外的指针间接得到Adaptee
·对象适配器:
1.允许Adapter与Adaptee本身及其所有子类同时工作。
2.重定义Adaptee的行为比较困难。
4.代理模式、适配器模式,组合模式要会实现。
·代理模式:
classGraphic
{
public:
virtual~Graphic();
virtualvoidDraw(constPoint&at)=0;
virtualvoidHandleMouse(Event&event)=0;
virtualconstPoint&GetExtent()=0;
virtualvoidLoad(istream&from)=0;
virtualvoidSave(ostream&to)=0;
protected:
Graphic();
};
classImage:
publicGraphic
{
public:
Image(constchar*file);//loadsimagefromafile
virtual~Image();
virtualvoidDraw(constPoint&at);
virtualvoidHandleMouse(Event&event);
virtualconstPoint&GetExtent();
virtualvoidLoad(istream&from);
virtualvoidSave(ostream&to);
private:
//...
};
classImageProxy:
publicGraphic
{
public:
ImageProxy(constchar*imageFile);
virtual~ImageProxy();
virtualvoidDraw(constPoint&at);
virtualvoidHandleMouse(Event&event);
virtualconstPoint&GetExtent();
virtualvoidLoad(istream&from);
virtualvoidSave(ostream&to);
protected:
Image*GetImage();
private:
Image*_image;
Point_extent;
char*_fileName;
};
ImageProxy:
:
ImageProxy(constchar*fileName)
{
_fileName=strdup(fileName);
_extent=Point:
:
Zero;//don'tknowextentyet
_image=0;
}
Image*ImageProxy:
:
GetImage()
{
if(_image==0)
{
_image=newImage(_fileName);
}
return_image;
}
constPoint&ImageProxy:
:
GetExtent()
{
if(_extent==Point:
:
Zero)
{
_extent=GetImage()->GetExtent();
}
return_extent;
}
voidImageProxy:
:
Draw(constPoint&at)
{
GetImage()->Draw(at);
}
voidImageProxy:
:
HandleMouse(Event&event)
{
GetImage()->HandleMouse(event);
}
voidImageProxy:
:
Save(ostream&to)
{
to<<_extent<<_fileName;
}
voidImageProxy:
:
Load(istream&from)
{
from>>_extent>>_fileName;
}
·适配器:
(上次说的必考的FixedStack、Array和Stack)
template
classStack{//Target
private:
intsize;
public:
Stack():
size(0){}
intSize(){returnsize;}
boolisEmpty(){returnsize==0;}
virtualvoidpush(T&elem)=0;
virtualTpop()=0;
};
template
classArray{//Adaptee
private:
intsize;
T*_array;
public:
Array(intsz):
size(sz){_array=newT[sz];}
~Array(){delete[]_array;}
intSize(){returnsize;}
T&ElementAt(inti){return_array[i];}
};
template
classFixedStack1:
publicStack,privateArray{//类适配器
public:
FixedStack1(intsize):
Array(size){}
virtualvoidpush(T&elem){Array:
:
ElementAt(size++)=elem;}//实现
virtualTpop(){returnArray:
:
ElementAt(--size);}//实现
boolisFull(){returnsize==Array:
:
Size();}//新方法
intCapacity{returnArray:
:
Size();}//新方法,并且是转发请求
};
template
classFixedStack2:
publicStack{//对象适配器
private:
Array
public:
FixedStack2(intsize){array=newArray
聚合(内部对象)
FixedStack2(Array
array(a){}//构造方法2:
适配外部对象
virtualvoidpush(T&elem){array->ElementAt(size++)=elem;}//实现
virtualTpop(){returnarray->ElementAt(--size);}//实现
boolisFull(){returnsize==array->Size();}//新方法
intCapacity{returnarray->Size();}//新方法,并且是转发请求
};
·组合模式:
classGlyph
{
public:
virtualvoidDraw(Window*w)=0;
virtualboolIntersects(Pointp)=0;
virtualvoidInsert(Glyphg,inti)=0;
//...
};
classCharacter:
publicGlyph
{
private:
charc;
public:
voidDraw(Window*w)
{
w->DrawCharacter(c);
}
boolIntersects(Pointp)
{
if(...)//判断条件:
pintersectsthischaracter
returntrue;
else
returnfalse;
}
};
classRectangle:
publicGlyph
{
public:
voidDraw(Window*w)
{
//...
}
boolIntersects(Pointp)
{
if(...)//判断条件:
pintersectsthisrectangle
returntrue;
else
returnfalse;
}
};
classPolygon:
publicGlyph
{
public:
voidDraw(Window*w)
{
//...
}
boolIntersects(Pointp)
{
if(...)//判断条件:
pintersectsthispolygon
returntrue;
else
returnfalse;
}
};
classRow:
publicGlyph
{
private:
vector
public:
voidDraw(Window*w)
{
for(inti=0;i { if(...)//判断条件: cispositionedcorrectly c->Draw(w); } } boolIntersects(Pointp) { boolresult=true; for(inti=0;i { Glyph*c=children[i]; result=result&&c->Intersects(p); } returnresult; } voidInsert(Glyphg,inti) { vector : iteratoriter=children.begin(); iter+=i; children.insert(iter,g); //或者children.insert(children.begin()+i,g); } };
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 复习 提纲