版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】设计模式4结构型模式
设计模式4
结构型模式目录
代理模式
装饰器
外观模式
适配器模式代理模式,美国,韩国代理购物
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
Item //商品
{
public:
Item(string
kind
,bool
fact)
{
this->kind
=
kind;
this->fact
=
fact;
}
string
getKind()
{
return
kind;
}
bool
getFact()
{
return
fact;
}
private:
string
kind
;
bool
fact;
};
class
Shopping
//抽象的购物方式
{
public:
virtual
void
buy(Item
*it)
=0;
};
class
KoreaShopping:public
Shopping
//Korea购物
{
public:
virtual
void
buy(Item
*it)
{
cout
<<
"去Korea
买了"
<<
it->getKind()
<<
endl;
}
};
class
USAShopping:public
Shopping
//USA购物
{
public:
virtual
void
buy(Item
*it)
{
cout
<<
"去USA
买了"
<<
it->getKind()
<<
endl;
}
};
int
main()
{
Item
it_1("Nike鞋",true);
if(it_1.getFact()
==
true) //辨别产品真假
{
cout
<<
"发现真货"
<<
endl;
Shopping
*koreaShopping
=
new
KoreaShopping;
koreaShopping->buy(&it_1);//代理
cout
<<
"过安检"
<<
endl;
}
else
{
cout
<<
"假货,不要买"
<<
endl;
}
Item
it_2("英语证书",false);
return
0;
}
chunli@linux:~$
g++
main.cpp
-Wall
&&
./a.out
发现真货
去Korea
买了Nike鞋
过安检
chunli@linux:~$代理模式,海外代理韩国与美国
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
Item //商品
{
public:
Item(string
kind
,bool
fact)
{
this->kind
=
kind;
this->fact
=
fact;
}
string
getKind()
{
return
kind;
}
bool
getFact()
{
return
fact;
}
private:
string
kind
;
bool
fact;
};
class
Shopping
//抽象的购物方式
{
public:
virtual
void
buy(Item
*it)
=0;
};
class
KoreaShopping:public
Shopping
//Korea购物
{
public:
virtual
void
buy(Item
*it)
{
cout
<<
"去Korea
买了"
<<
it->getKind()
<<
endl;
}
};
class
USAShopping:public
Shopping
//USA购物
{
public:
virtual
void
buy(Item
*it)
{
cout
<<
"去USA
买了"
<<
it->getKind()
<<
endl;
}
};
class
OverseaProxy:public
Shopping
{
public:
OverseaProxy(Shopping
*shopping)
{
this->shopping
=
shopping;
}
virtual
void
buy(Item
*it)
{
//购买之前
if(it->getFact()
==
false)
{
cout
<<
"发现假货,不要购买"
<<
endl;
return
;
}
//开始购买
shopping->buy(it);
//购买之后
cout
<<
"通过安检,后买成功!"
<<
endl;
}
private:
Shopping
*shopping;
};
int
main()
{
Shopping
*usaShopping
=
new
USAShopping;
Shopping
*overseaProxy
=
new
OverseaProxy(usaShopping);
Item
it1("英语证书",false); overseaProxy->buy(&it1);
Item
it2("Dell
服务器",true); overseaProxy->buy(&it2);
return
0;
}
chunli@linux:~$
g++
main.cpp
-Wall
&&
./a.out
发现假货,不要购买
去USA
买了Dell
服务器
通过安检,后买成功!
chunli@linux:~$看图:
subject(抽象主题角色):真实主题与代理主题的共同接口。
RealSubject(真实主题角色):定义了代理角色所代表的真实对象。
Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。
优点:
(1)能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
(2)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
缺点:
(1)代理实现较为复杂。装饰器:把手机裸机装饰成有贴膜的手机
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
Phone
{
public:
virtual
void
show()
=
0;
};
class
iPhone:public
Phone
{
public:
virtual
void
show()
{
cout
<<
"秀出了iPhone"<<
endl;
}
};
class
Mi:public
Phone
{
public:
virtual
void
show()
{
cout
<<
"秀出了
小米"<<
endl;
}
};
//抽象装饰器
class
Decorator:public
Phone
{
public:
Decorator(Phone
*phone)
{
this->phone
=
phone;
}
virtual
void
show()
=
0;
protected:
Phone
*phone;//拥有一个手机的父类指针
};
//贴膜装饰器
class
MoDecorator:public
Decorator
{
public:
MoDecorator(Phone
*phone):Decorator(phone)
{
}
virtual
void
show()
{
this->phone->show();
this->mo();
}
void
mo()
{
cout
<<
"手机
贴膜了
"
<<
endl;
}
};
int
main()
{
Phone
*phone
=
new
iPhone; //创建一个裸机
phone->show();//裸机
show()
cout
<<
""
<<endl;
Phone
*mophone
=
new
MoDecorator(phone);
mophone->show();
return
0;
}
chunli@linux:~$
g++
main.cpp
-Wall
&&
./a.out
秀出了iPhone
秀出了iPhone
手机
贴膜了
chunli@linux:~$装饰器,在贴膜的手机,加壳
chunli@linux:~$
g++
main.cpp
-Wall
&&
./a.out
秀出了iPhone
秀出了iPhone
手机
贴膜了
秀出了iPhone
手机
贴膜了
手机
加壳了
chunli@linux:~$
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
Phone
{
public:
virtual
void
show()
=
0;
};
class
iPhone:public
Phone
{
public:
virtual
void
show()
{
cout
<<
"秀出了iPhone"<<
endl;
}
};
class
Mi:public
Phone
{
public:
virtual
void
show()
{
cout
<<
"秀出了
小米"<<
endl;
}
};
//抽象装饰器
class
Decorator:public
Phone
{
public:
Decorator(Phone
*phone)
{
this->phone
=
phone;
}
virtual
void
show()
=
0;
protected:
Phone
*phone;//拥有一个手机的父类指针
};
//贴膜装饰器
class
MoDecorator:public
Decorator
{
public:
MoDecorator(Phone
*phone):Decorator(phone)
{
}
virtual
void
show()
{
this->phone->show();
this->mo();
}
void
mo()
{
cout
<<
"手机
贴膜了
"
<<
endl;
}
};
//手机壳
装饰器
class
ShellDecorator:public
Decorator
{
public:
ShellDecorator(Phone
*phone):Decorator(phone)
{
}
virtual
void
show()
{
this->phone->show();
this->shell();
}
void
shell()
{
cout
<<
"手机
加壳了
"
<<
endl;
}
};
int
main()
{
Phone
*phone
=
new
iPhone; //创建一个裸机
phone->show();//裸机
show()
cout
<<
""
<<endl;
Phone
*mophone
=
new
MoDecorator(phone);
mophone->show();
cout
<<
""
<<endl;
Phone
*shellPhone
=
new
ShellDecorator(mophone);
shellPhone->show();
return
0;
}
chunli@linux:~$
g++
main.cpp
-Wall
&&
./a.out
秀出了iPhone
秀出了iPhone
手机
贴膜了
秀出了iPhone
手机
贴膜了
手机
加壳了
chunli@linux:~$看图
Component(抽象构件):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。
ConcreteComponent(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。
Decorator(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
ConcreteDecorator(具体装饰类):它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。
4.2.3装饰模式的优缺点
优点:
(1)对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。
(2)
可以通过一种动态的方式来扩展一个对象的功能,从而实现不同的行为。
(3)
可以对一个对象进行多次装饰。
(4)具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则”。
缺点:
(1)使用装饰模式进行系统设计时将产生很多小对象,大量小对象的产生势必会占用更多的系统资源,影响程序的性能。
外观模式:演示:为了调用AB方法,需要显式的调用AB
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
SysA
{
public:
void
operationA()
{
cout
<<
"A"
<<
endl;
}
};
class
SysB
{
public:
void
operationB()
{
cout
<<
"B"
<<
endl;
}
};
class
SysC
{
public:
void
operationC()
{
cout
<<
"C"
<<
endl;
}
};
class
SysD
{
public:
void
operationD()
{
cout
<<
"D"
<<
endl;
}
};
int
main()
{
SysA
sysa; sysa.operationA();
SysB
sysb; sysb.operationB();
return
0;
}
chunli@linux:~$
g++
main.cpp
&&
./a.out
A
B
chunli@linux:~$现在只需要通过外观访问:打包组合起来
chunli@linux:~$
cat
main.cpp
#include<iostream>
using
namespace
std;
class
SysA
{
public:
void
operationA()
{
cout
<<
"A"
<<
endl;
}
};
class
SysB
{
public:
void
operationB()
{
cout
<<
"B"
<<
endl;
}
};
class
SysC
{
public:
void
operationC()
{
cout
<<
"C"
<<
endl;
}
};
class
SysD
{
public:
void
operationD()
{
cout
<<
"D"
<<
endl;
}
};
class
Facade
{
public:
void
methodOne()
{
sysa.operationA();
sysb.operationB();
}
void
methodTwo()
{
sysc.operationC();
sysd.operationD();
}
private:
SysA
sysa;
SysB
sysb;
SysC
sysc;
SysD
sysd;
};
int
main()
{
Facade face; face.methodOne();
return
0;
}
chunli@linux:~$
g++
main.cpp
&&
./a.out
A
B
chunli@linux:~$适配器模式手机充电需要使用5V电压,创建一个适配器,将220V电压转换成5V
chunli@linux:~$
cat
main.cpp
#include
<iostream>
using
namespace
std;
class
V5
{
public:
virtual
void
useV5()
=
0;
};
//目前只有v220的类
没有v5
class
V220
{
public:
void
useV220()
{
cout
<<
"使用了220v的电压"
<<
endl;
}
};
//定义一个中间的适配器类
class
Adapter
:public
V5
{
public:
Adapter(V220
*
v220)
{
this->v220
=
v220;
}
~Adapter()
{
if
(this->v220
!=
NULL)
{
delete
this->v220;
}
}
virtual
void
useV5()
{
v220->useV220();
//调用需要另外的方法
}
private:
V220
*v220;
};
class
iPhone
{
public:
iPhone(V5
*v5)
{
this->v5
=
v5;
}
~iPhone()
{
if
(this->v5
!=
NULL)
{
delete
this->v5;
}
}
//充电的方法
void
charge()
{
cout
<<
"iphone手机进行了充电"
<<
endl;
v5->useV5();
}
private:
V5*v5;
};
int
main(void)
{
iPhone
*phone
=
new
iPhone(new
Adapter(new
V220));
phone->charge();
return
0;
}
chunli@linux:~$
g++
main.cpp
&&
./a.out
iphone手机进行了充电
使用了220v的电压
chunli@linux:~$适配器模式中的角色和职责
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【提高卷】2024年浙教版数学七年级下册6.3扇形统计图 同步练习
- 【培优卷】2020-2021学年沪教版小学五年级数学下册《第三章 简易方程(二)》单元测试题(含解析)
- 【提高卷】2024年浙教版数学七年级下册6.4 频数与频率 同步练习
- 《不动产测绘(活页式)》 课件全套 1-5不动产测绘概述- 不动产测绘成果的检查与验收
- 实习生自我小结
- 促销方案之汽修厂促销活动方案
- 2024年企业员工劳动合同标准范文(二篇)
- 2024年咨询服务委托协议格式版(二篇)
- 2024年购房居间合同(二篇)
- 2024年农产品购销合同范例(三篇)
- 智慧高校大数据云平台整体解决方案
- 国家开放大学电大《计算机应用基础(本)》终结性考试试题答案(格式已排好)任务一
- oracle存储过程文档
- Pentaho-Data-Integration-完全自学手册
- 餐饮技术传授合同范本(2篇)
- 鼻颅底解剖课件
- 我国特殊教育法制建设课件
- 护士长工作考核评分标准
- 人教版数学一年级下册第6单元 带小括号的两步混合运算教案与反思
- DB15T 389-2021 内蒙古自治区造林技术规程
- 质量意识培训测试试题及答案
评论
0/150
提交评论