页数:33页文件大小:192.3 KB来源: 设计模式ppt课件
本课件讲解结构型设计模式,说明桥接模式如何分离接口与实现、适配器模式如何转换已有接口、合成模式如何一致地处理树形结构,以及门面模式如何为子系统提供统一入口。
第三部分结构型设计模式
3.1桥接模式(Bridge Pattern)
class A{ public: virtual ~A(); virtual void f( ); virtual void g( ); private: intx; inty; };变化的三个方向:1)接口的变化2)实现的变化3)属性的变化(本质上,还是实现的变化)适应单个方向的变化
适应接口变化方法class A{public:virtual ~A();virtual void f( );virtual void g( );protected :intx;inty;};class NewA:public A{public:virtual ~NewA( );virtual void h( );};class NewA{public:NewA(A * oldA):pa(oldA) { }virtual ~NewA( );virtual void f( ) { pa->f( ); }virtual void g( ) { pa->g( ); }virtual void h( );private:A* pa;};适应实现变化方法class A{public:virtual ~A();virtual void f( );virtual void g( );protected:intx;inty;};class NewA:public A {public:virtual ~NewA( );virtual void f( ) {}};class NewA {public:NewA(A * oldA):pa(oldA) { }virtual ~NewA( );virtual void f( ) {}virtual void g( ) { pa->g( ); }protected:A* pa;};class NewA {public:NewA(ImpF * f,ImpG * g):pf(f),pg(g) { }virtual ~NewA( );virtual void f( ) {pf->f( );}virtual void g( ) { pg->g( ); }private:ImpF * pf;ImpG * pg;};class ImpF {public:virtual ~ImpF( );vritual void f( )=0;};class ImpF1:public ImpF {public:virtual ~ImpF1( );vritual void f( ) { }};两个方向同时变化的适应
第一步:分离接口和实现classA {public:virutal ~A( );virtual void f( ) ;virtual void g( );};class ImpA {public:virtual ~ImpA();virtual void f( );virtual void g( );protected:intx;inty;};第二步:用组合连接接口和实现classA {public:virutal ~A(ImpA * p):impA(p) {}virtual void f( ) { impA->f( ); }virtual void g( ) { impA->g( );}private:ImpA* impA;};class ImpA {public:virtual ~ImpA();virtual void f( );virtual void g( );protected:intx;inty;};第三步:使接口和实现的变化独立classA {public:virutal ~A(ImpA * p):impA(p) {}virtual void f( ) { impA->f( ); }virtual void g( ) { impA->g( );}private:ImpA* impA;};class ImpA {public:virtual ~ImpA();virtual void f( );virtual void g( );protected:intx;inty;};classNewA:pubic A {public:virutal ~NewA(ImpA * p):A(p) {}virtual void h( ) { }};class ImpA1:public ImpA {public:virtual void f( ) { }};继承继承组合3.1.2效果
3.1.3结构
3.2适配器模式(Adapter Pattern)
学生、教师class IStudent {public:virtual ~IStudent();virtual void上课( );virtual void休息( );};class Teacher {public:virtual ~Teacher( );virtual void授课();virtual void玩();};1.学生可有本科生、硕士研究生、博士研究生等;2.现增加一类在职学生----本身也是教师。3.这时,在职学生的上课就是教师的授课;4.怎么才能将教师,当做学生来使用呢?问题
类的适配器模式class IStudent {public:virtual ~IStudent();virtual void上课( ) =0;virtual void休息( )= 0;};class Teacher {public:virtual ~Teacher( );virtual void授课();virtual void玩();};class在职学生: public IStudent, private Teacher {public:virtual ~在职学生();virtual void上课( ) {授课();}virtual void休息( ) {玩(); }};对象适配器方式class IStudent {public:virtual ~IStudent();virtual void上课( ) =0;virtual void休息( )= 0;};class Teacher {public:virtual ~Teacher( );virtual void授课();virtual void玩();};class在职学生: public IStudent{public:在职学生(Teacher * t): tc(t) { }virtual ~在职学生();virtual void上课( ) { tc.授课();}virtual void休息( ) { tc.玩(); }private:Teacher *tc;};3.2.2效果
3.2.4类适配器结构
3.2.5对象适配器结构
3.3合成模式(Compsite Pattern)一个树形结构:树枝树叶树枝树枝树叶树枝树叶树枝树枝树叶树枝树叶树枝树枝树叶
节点的关系表示
一般化表示
子节点的管理
3.3.2透明式合成模式结构(1)
透明式合成模式结构(2)
安全式合成模式
3.3.3例子
3.4门面模式(Facade Pattern)一个子系统:内部有许多类,该子系统通过这些类和它们之间的交互作用,为客户提供相应的功能。
CBDA用户1用户21.用户必须清楚子系统中的各部分的职责;2.用户不关心子系统的实现,而只是应用子系统中的已有功能;3.用户的访问,通常是单向的;
CBDA用户1用户2门户
3.4.2结构Facade
3.4.3效果
3.4.4例DirectX:Direct3D、DirectInput、DirectMedia
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}