实验四 123130309 勾志竟.docx
- 文档编号:11008015
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:29
- 大小:312.99KB
实验四 123130309 勾志竟.docx
《实验四 123130309 勾志竟.docx》由会员分享,可在线阅读,更多相关《实验四 123130309 勾志竟.docx(29页珍藏版)》请在冰点文库上搜索。
实验四123130309勾志竟
实验四
结构型设计模式的软件体系结构
目录
适配器模式2
一.概念2
二.UML2
三.更加生动的例子2
四.实例分析3
五.对象的适配器和类的适配器6
六.使用场景及使用感受7
七.适配器模式与装饰者模式8
组合模式8
一.组合模式的概念8
二.参与者8
三.实现的代码:
9
四.总结11
外观模式11
一.概述11
二.问题12
三.解决方案12
四.适用性12
五.结构13
六.构建模式的组成14
七.效果14
八.实现14
代理模式17
一.代理模式概念17
二.代理模式结构图18
三.类实现18
适配器模式
一.概念
适配器模式将一个接口转换成客户希望的另外一个接口。
它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。
二.UML
三.更加生动的例子
四.实例分析
需要给笔记本电脑配罗技G1光电套。
但光电套的鼠标是USB接口,键盘是PS2接口,可笔记本却没有PS2接口啊。
于是需要一个转接器。
抽象出几个类。
1.PS2Port(PS2接口)。
2.USBPort(USB接口)。
3.PS2ToUSB(对象适配器),将PS2接口装换成USB接口。
4.TestAdapter(测试类),客户端。
PS2Port
Java代码
1.packagecom.zzy.adapter;
2.
3./**
4.*PS2接口,圆口
5.*@authoreason
6.*
7.*/
8.publicinterfacePS2Port{
9.publicvoidworkWithPS2();
10.}
packagecom.zzy.adapter;
/**
*PS2接口,圆口
*@authoreason
*
*/
publicinterfacePS2Port{
publicvoidworkWithPS2();
}
USBPort
Java代码
1.packagecom.zzy.adapter;
2.
3./**
4.*USB接口,U口
5.*@authoreason
6.*
7.*/
8.publicinterfaceUSBPort{
9.publicvoidworkWithUSB();
10.}
packagecom.zzy.adapter;
/**
*USB接口,U口
*@authoreason
*
*/
publicinterfaceUSBPort{
publicvoidworkWithUSB();
}
PS2ToUSB
Java代码
1.packagecom.zzy.adapter;
2.
3./**
4.*对象适配器
5.*将PS2接口装换成USB接口
6.*所以此类类型是USB接口(implementsUSBPort)+成员变量ps2Port
7.*@authoreason
8.*
9.*/
10.publicclassPS2ToUSBimplementsUSBPort{
11.
12.privatePS2Portps2Port;
13.
14.publicPS2ToUSB(PS2Portps2Port){
15.this.ps2Port=ps2Port;
16.}
17.
18.@Override
19.publicvoidworkWithUSB(){
20.System.out.println("转换的关键在这里,本来是");
21.ps2Port.workWithPS2();
22.System.out.println("经过你的转换,现在是USB工作中");
23.}
24.
25.}
packagecom.zzy.adapter;
/**
*对象适配器
*将PS2接口装换成USB接口
*所以此类类型是USB接口(implementsUSBPort)+成员变量ps2Port
*@authoreason
*
*/
publicclassPS2ToUSBimplementsUSBPort{
privatePS2Portps2Port;
publicPS2ToUSB(PS2Portps2Port){
this.ps2Port=ps2Port;
}
@Override
publicvoidworkWithUSB(){
System.out.println("转换的关键在这里,本来是");
ps2Port.workWithPS2();
System.out.println("经过你的转换,现在是USB工作中");
}
}
TestAdapter
Java代码
1.packagecom.zzy.adapter;
2.
3./**
4.*测试类
5.*client
6.*@authoreason
7.*
8.*/
9.publicclassTestAdapter{
10.
11.publicstaticvoidmain(String[]args){
12.//1.我现在有一个PS2接口
13.PS2Portps2Port=newPS2Port(){
14.@Override
15.publicvoidworkWithPS2(){
16.System.out.println("PS2工作中");
17.}
18.};
19.
20.//2.但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口
21.//3.经过PS2ToUSB的转换,PS2接口变成了USB接口
22.USBPortps2ToUsbPort=newPS2ToUSB(ps2Port);
23.
24.ps2ToUsbPort.workWithUSB();
25.
26.}
27.
28.}
/**
*测试类
*client
*@authoreason
*
*/
publicclassTestAdapter{
publicstaticvoidmain(String[]args){
//1.我现在有一个PS2接口
PS2Portps2Port=newPS2Port(){
@Override
publicvoidworkWithPS2(){
System.out.println("PS2工作中");
}
};
//2.但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口
//3.经过PS2ToUSB的转换,PS2接口变成了USB接口
USBPortps2ToUsbPort=newPS2ToUSB(ps2Port);
ps2ToUsbPort.workWithUSB();
}
}
五.对象的适配器和类的适配器
上述的适配器就是对象适配器。
再看看类适配器。
PS2ToUSB,只是简单模拟一下。
因为java不允许多继承,所以java中没有类模式的代码,只有思想。
Java代码
1.packagecom.zzy.adapter;
2.
3./**
4.*类适配器
5.*@authoreason
6.*
7.*/
8.publicclassPS2ToUSBimplementsUSBPort,PS2Port{
9.
10.//重写workWithUSB,把工作交给workWithPS2
11.@Override
12.publicvoidworkWithUSB(){
13.workWithPS2();
14.}
15.
16.}
packagecom.zzy.adapter;
/**
*类适配器
*@authoreason
*
*/
publicclassPS2ToUSBimplementsUSBPort,PS2Port{
//重写workWithUSB,把工作交给workWithPS2
@Override
publicvoidworkWithUSB(){
workWithPS2();
}
}
差别就是:
对象适配器实现了客户端想要的接口(USB),在内部有一个被适配对象(PS2)的引用,通过组合实现适配功能。
类适配器实现了客户端想要的接口(USB)和被适配对象接口(PS2),通过继承来实现适配功能。
六.使用场景及使用感受
1.希望复用一些现存的类,但是接口又与复用环境要求不一致。
2.其实适配器模式有点无奈之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该考虑通过重构统一接口。
七.适配器模式与装饰者模式
它们都可以用来包装对象,本质区别在于
1.适配器模式:
将一个接口转换成另外一个接口。
2.装饰者模式:
不改变接口,只加入职责。
组合模式
一.组合模式的概念
组合模式属于结构型模式,其意图是将对象组合成树形结构以表示部分-整体的层次结构,composite模式使得用户对单个对象和组合对象的使用具有一致性。
Composite模式的一个重要思想是递归组合,关键是一个抽象类,它既可以代表组合对象,又可以代表一个被组合的对象。
经常在Java开发中遇到的容器就使用了组合模式,一方面组件可以放在容器中,另一方面容器也可以作为组件放在另外的容器中。
实用性:
l你想表示对象的部分-整体层次结构
l你希望用户忽略组合对象与单个对象的不同,用户同意地使用组合结构中的所有对象。
二.参与者
Component
为组合中的对象声明接口。
在适当的情况下,实现所有类共有接口的缺省行为。
声明一个接口用于访问和管理Componebt的子组件。
在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现。
Leaf
在组合中表示叶节点对象,叶节点对象没有子节点。
在组合中定义图元对象的行为。
Composite
定义有子部件的那些部件的行为
存储子部件,
在Component接口中实现与子部件有关的操作。
Client
通过Component接口操纵组合部件的对象。
其协作过程是:
用户使用Compoment类接口与组合结构中的对象进行交互。
如果接受者是一个叶节点,则直接处理请求。
如果接受者是Composite,它通常将请求发送给他的字部件,在转发请求之前或者之后可能执行一些辅助操作。
在本例子中,没有什么特殊之处,所不同的是Composite可以容纳Component的子类对象,包括本身。
例子本省也比较简单,平淡无味,单却可以在特定的场景能很好的解决特定的问题。
使用组合模式有如下的好处:
l定义了饱含基本对象和组合对象的类层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象有可以被组合。
l简化客户代码客户可以一直地使用组合结构和单个对象,通常用户不知道处理的是一个叶节点还是一个组合组件。
l使得更容易增加新类型的组件,新定义的Composite或leaf子类自动地与义有的结构和客户代码一起工作,客户程序不需要因为新的Component类而改变。
l使你的设计变得更一般化。
三.实现的代码:
Component接口:
packagecomposite;
publicinterfaceComponent{
publicintgetSize();
publicintgetChildNum();
publicStringgetType();
publicStringgetName();
publicvoidadd(Componentc);
publicvoidremove(Componentc);
}
Leaf类:
packagecomposite;
publicclassLeafimplementsComponent{
privateintsize;
privateStringname;
publicLeaf(StringaName,intaSize){
size=aSize;
name=aName;
}
publicStringgetName(){
returnname;
}
publicStringgetType(){
return"Leaf";
}
publicintgetSize(){
returnsize;
}
publicintgetChildNum(){
return1;
}
publicvoidadd(Componentc){
System.err.println("Notsupportedmethod!
");
}
publicvoidremove(Componentc){
System.err.println("Notsupportedmethod!
");
}
}
Composite类:
packagecomposite;
publicclassLeafimplementsComponent{
privateintsize;
privateStringname;
publicLeaf(StringaName,intaSize){
size=aSize;
name=aName;
}
publicStringgetName(){
returnname;
}
publicStringgetType(){
return"Leaf";
}
publicintgetSize(){
returnsize;
}
publicintgetChildNum(){
return1;
}
publicvoidadd(Componentc){
System.err.println("Notsupportedmethod!
");
}
publicvoidremove(Componentc){
System.err.println("Notsupportedmethod!
");
}
}
客户端代码:
packagecomposite;
publicclassClient{
publicstaticvoidmain(String[]args){
Componentroot=newComposite("root");
Componentcomposite=newComposite("composite");
Componentleaf1=newLeaf("leaf1",20);
Componentleaf2=newLeaf("leaf2",40);
root.add(leaf1);
composite.add(leaf2);
root.add(composite);
Stringstr="Leaf1'ssizeis"+leaf1.getSize();
str+="\nleaf2'ssizeis"+leaf2.getSize();
str+="\nComposite'ssizeis"+composite.getSize();
str+="\nRoot'ssizeis"+root.getSize();
System.out.println(str);
}
}
四.总结
组合模式在解决整体与部分的问题中应用比较广泛,一个组合也可以被看作部分来处理,降低了处理问题的难度。
外观模式
一.概述
外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。
例子1:
一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。
该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。
二.问题
为了降低复杂性,常常将系统划分为若干个子系统。
但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?
三.解决方案
外观模式:
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
四.适用性
在遇到以下情况使用facade模式:
1)当你要为一个复杂子系统提供一个简单接口时。
子系统往往因为不断演化而变得越来越复杂。
大多数模式使用时都会产生更多更小的类。
这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
facade可以提供一个简单的缺省视图,
这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。
引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3)当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。
如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
五.结构
六.构建模式的组成
外观角色(Facade):
是模式的核心,他被客户client角色调用,知道各个子系统的功能。
同时根据客户角色已有的需求预订了几种功能组合\
子系统角色(Subsystemclasses):
实现子系统的功能,并处理由Facade对象指派的任务。
对子系统而言,facade和client角色是未知的,没有Facade的任何相关信息;即没有指向Facade的实例。
客户角色(client):
调用facade角色获得完成相应的功能。
七.效果
Facade模式有下面一些优点:
1)对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。
通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
2)实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
3)降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
4)只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
Facade模式的缺点
1)不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
2)在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
八.实现
我们使用开关的例子;
[php]viewplaincopyprint?
1.
php
2./**
3.*外观模式
4.*
5.*/
6.classSwitchFacade
7.{
8.private$_light=null;//电灯
9.private$_ac=null;//空调
10.private$_fan=null;//电扇
11.private$_tv=null;//电视
12.
13.publicfunction__construct()
14.{
15.$this->_light=newLight();
16.$this->_fan=newFan();
17.$this->_ac=newAirConditioner();
18.$this->_tv=newTelevision();
19.}
20./**
21.*晚上开电灯
22.*
23.*/
24.publicfunctionmethod1($isOpen=1){
25.if($isOpen==1){
26.$this->_light->on();
27.$this->_fan->on();
28.$this->_ac->on();
29.$this->_tv->on();
30.}else{
31.$this->_light->off();
32.$this->_fan->off();
33.$this->_ac->off();
34.$this->_tv->off();
35.}
36.
37.}
38./**
39.*白天不需要电灯
40.*
41.*/
42.publicfunctionmethod2(){
43.if($isOpen==1){
44.$this->_fan->on();
45.$this->_ac->on();
46.$this->_tv->on();
47.}else{
48.$this->_fan->off();
49.$this->_ac->off();
50.$this->_tv->off();
51.}
52.}
53.}
54.
55./******************************************子系统类************/
56./**
57.*
58.*/
59.classLight
60.{
61.private$_isOpen=0;
62.publicfunctionon(){
63.echo'Lightisopen','
';
64.$this->_isOpen=1;
65.}
66.publicfunctionoff(){
67.echo'Lightisoff
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 123130309 勾志竟 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)