【移动应用开发技术】设计模式4 结构型模式_第1页
【移动应用开发技术】设计模式4 结构型模式_第2页
【移动应用开发技术】设计模式4 结构型模式_第3页
【移动应用开发技术】设计模式4 结构型模式_第4页
【移动应用开发技术】设计模式4 结构型模式_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】设计模式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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论