C语言与软件重用.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C语言与软件重用.ppt》由会员分享,可在线阅读,更多相关《C语言与软件重用.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第13章 设计模式(DesignPattern)132 可重用的面向对象设计模式可重用的面向对象设计模式13.2.1 设计模式概述设计模式概述1.面向对象设计的任务:面向对象设计的任务:应用系统设计应用系统设计工具库设计工具库设计框架设计框架设计其中,框架是已形成源代码的可重用软件体系结构。它体现了应用程序的模块组成关系。框架及框架中的各个模块是形形色色各具特色的。设计模式(DesignPattern)描述了软件开发过程中若干重复出现的问题的解决方案,这些方案不是由过程、算法等底层程序构造实体实现,而是由软件系统中类与类之间或不同类的对象之间的共生关系组成。设计模式可以帮助软件设计人员学习、重
2、用前人的经验和成果。设 计 模 式 的 分 类 整 理 最 早 见 于 ErichGamma在德国慕尼黑大学的博士论文。1995年,Erich Gamma,Richard Helm,RalphJohnson,JohnVlissides合著的 Design Patterns:Elements of ReusableObject_OrientedSoftware系统地整理和描述了23个精选的设计模式(goF模式),为设计模式的学习、研究和推广提供了良好的范例。ClassNameFunction1()Function2()DataMenber1DataMenber2类的表示:子类关系:BaseCla
3、ssSubclass2设计模式的描述符号设计模式的描述符号(1)类和对象的表示对象及对象链接:aObjectanotherObject(2)连接的表示)连接的表示例如:由类A创建类B的对象ClassAClassB对象创建关系:对象创建关系:示例代码:classA:create()returnnewClassB;实例引用关系实例引用关系:ClassAClassBrefrenceName(引用名可选)Window:Area()returnaRectArea();WindowArea()RectangleArea()widthheightRectangle:Area()returnwidth*hei
4、ght;引用关系涉及到的两个类的实例之间可以形成一种代理关系,接受请求的对象将操作委托给它的代理者:aRect对象聚合关系:对象聚合关系:objectsClassAClassB如:下图表示类A中聚合了多个类B的对象。聚合关系可以用对象成员实现,但更经常的是将聚合的成员定义为对象成员指针或引用。由于引用关系也是以对象成员指针或引用来实现的,注意从设计意图上区分对象聚合关系和引用关系对理解设计模式是至关重要的。聚合是对象的包容关系,容器和容器中的对象具有相同的生命期。引用关系又称相识关系,是一种较松散的耦合关系。具有引用关系的对象,仅仅是知道被引用者的存在,并不为对方负责,1抽象工厂(抽象工厂(A
5、bstract Factory)模式)模式抽象工厂定义一个抽象基类,为创建组合对象提供接口。在面向对象系统中,单个对象的创建由构造函数负责。一个组合对象的动态创建可由一个创创建建函函数数一次性完成,以保证被创建的组合对象的完备性。抽象工厂定义的接口称为创建函数或初始化函数。抽象工厂的不同实现类(可称为实现工厂)的对象可以按不同的风格去实现组合对象的具体创建,可以在保证组合对象被完备创建的前提下,简化组合对象的版本替换、升级换代过程。工厂方法(工厂方法(Factory Method)是一些动态创建对象的方法。是在抽象工厂中声明的一组虚函数,它们负责组合对象中成员对象的创建,其实现代码在实现工厂中
6、定义。抽象工厂模式通常与工厂方法配合使用抽象工厂模式通常与工厂方法配合使用Product1Part11Part12Product2Part21Part22ProductFactoryProductCreate()FactoryMethod1()FactoryMethod2()ConcreatBFactoryMethod1()FactoryMethod2()ConcreatAFactoryMethod1()FactoryMethod2()图13.1抽象工厂和工厂方法模式结构举例1创建函数:创建函数:一个抽象的产品工厂类ProductFactory定义了由两个零件组成的组件产品的创建函数Produ
7、ct*ProductCreate();以及创建零件的工厂方法。抽象的产品工厂的实现工厂ConcreteProduct重定义了创建零件对象的工厂方法。创建函数Product*ProductCreate()调用工厂方法,一次性创建产品。返回产品指针。2产品类与零件类产品类与零件类产品类Product与零件类Part可以是分别定义的类,产品类以零件类为自己的对象成员。ProductCreate()创建一个由2个Part1和1个Part2组合而成的Product组合对象。如果将Product定义为抽象基类,且Part1和Part2定义为它的实现类,则可以得到更加复杂的Product组合关系。class
8、ProductFactory/抽象工厂定义Public:Product*ProductCreate();VirtualPart1*FactoryMethod1();VirtualPart2*FactoryMethod2();/;classConcreteA:publicProductFactory/实现工厂定义Public:VirtualPart1*FactoryMethod1()returnnewPart1;VirtualPart2*FactoryMethod2()returnnewPart2;/;Product*ProductFactory:ProductCreate()Product*p
9、tr;Part1*p11=FactoryMethod1();Part1*p12=FactoryMethod1();Part1*p21=FactoryMethod2();Ptr=p11;Returnptr;classProduct;classPart1;classPart2;3用工厂对象参数化参数化组合对象创建过程:工厂对象即实现工厂的实例对象。修改生产函数ProductCreate()如下:Product*ProductCreate(ProductFactory*);/创建函数以抽象工厂的指针为形参。若再定义一个抽象工厂的实现类:classConcreteB:publicProductFact
10、ory然后声明:ConcreteA*FactoryA;ConcretetB*FactoryB;则调用:ProductCreate(FactoryA);ProductCreate(FactoryA);将生产A、B两个不同系列的产品。很容易实现产品系列的更新换代。如:Product和Part分别代表电脑主机和配件,产品更新换代只要定义新的抽象工厂的实现类,并用它来参数化生产函数即可,不必对系统的其它部分作任何改动。class Applicationstatic Application*instance;Application();public:static int count;Applicatio
11、n();static Application*init();Application*Application:instance=NULL;int Application:count=0;Application*Application:init()if(count=0)count=count+1;instance=new Application;coutSingle instance has created,OK!endl;return instance;else coutCant create more than one instance!endl;return NULL;Application
12、:Application()count=count-1;coutThe single instance has released!GetPicture()test-Add(newRectangle);aGraphic=aRectangle;if(test=aGraphic-GetPicture()test-Add(newRectangle);/此次Add()操作实际并不执行为了识别一个组件是基元还是组合,可按以下示例代码,定义一 个 查 询 函 数 GetPicture(),对其返回的组合安全地执行Add()和 Remove()操作:3共享对象(共享对象(Flyweight)模式)模式:细粒度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 软件 重用
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内