第十章 结构型模式_第1页
第十章 结构型模式_第2页
第十章 结构型模式_第3页
第十章 结构型模式_第4页
第十章 结构型模式_第5页
已阅读5页,还剩254页未读 继续免费阅读

下载本文档

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

文档简介

1、软件体系结构第十章 结构型模式结构性模式结构性模式n概述概述q结构型模式结构型模式(Structural Pattern)描述描述如何将类或者对象如何将类或者对象结合在一起形成更大的结构结合在一起形成更大的结构,就像搭积木,可以通过简,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。单积木的组合形成复杂的、功能更为强大的结构。 结构性模式结构性模式n概述概述q根据这一点,结构型模式可以分为根据这一点,结构型模式可以分为类结构型模式类结构型模式和和对象结构型模式对象结构型模式:n类结构型模式关心类的组合类结构型模式关心类的组合,由多个类可以组合成一个更,由多个类可以组合成一个更

2、大的系统,在类结构型模式中一般只存在继承关系和实现大的系统,在类结构型模式中一般只存在继承关系和实现关系。关系。n对象结构型模式关心类与对象的组合,通过关联关系使得对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象在一个类中定义另一个类的实例对象,然后通过该对象调,然后通过该对象调用其方法。根据用其方法。根据“合成复用原则合成复用原则”,在系统中尽量使用关,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。结构型模式。n本章的内容与目标本章的内容与目标q适配器模式适配器模式(Adap

3、ter) q桥接模式桥接模式(Bridge) q组合模式组合模式(Composite) q装饰模式装饰模式(Decorator)q外观模式外观模式(Facade) q享元模式享元模式(Flyweight) q代理模式代理模式(Proxy) 适配器模式适配器模式n意图意图q适配器适配器适配器模式适配器模式n意图意图q适配器适配器适配器适配器适配器模式适配器模式n意图意图q软件系统中的适配器软件系统中的适配器适配器模式适配器模式n意图意图q软件系统中的适配器软件系统中的适配器适配器模式适配器模式n意图意图q软件系统中的适配器软件系统中的适配器n方法一:修改方法一:修改system或修改或修改B,都

4、违反开闭原则,都违反开闭原则适配器模式适配器模式n意图意图q软件系统中的适配器软件系统中的适配器n方法二:增加适配器方法二:增加适配器适配器模式适配器模式n意图意图q软件系统中的适配器软件系统中的适配器n方法二:增加适配器方法二:增加适配器适配器模式适配器模式n意图意图q在软件开发中采用类似于电源适配器的设计和编码技巧被称在软件开发中采用类似于电源适配器的设计和编码技巧被称为为适配器模式适配器模式。 q通常情况下,通常情况下,客户端可以通过目标类的接口访问它所提供的客户端可以通过目标类的接口访问它所提供的服务服务。有时,现有的类。有时,现有的类可以满足客户类的功能需要可以满足客户类的功能需要,

5、但是它,但是它所提供的所提供的接口不是客户类所期望的接口不是客户类所期望的,比如:现有类中方法名,比如:现有类中方法名与目标类中定义的方法名不一致等原因所导致的与目标类中定义的方法名不一致等原因所导致的q在这种情况下,现有的在这种情况下,现有的接口需要转化为客户类期望的接口接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。样的转化。 适配器模式适配器模式n意图意图q在适配器模式中可以定义一个包装类

6、,包装不兼容接口的对在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是象,这个包装类指的就是适配器适配器(Adapter),它所包装的对象,它所包装的对象就是就是适配者适配者(Adaptee),即被适配的类。,即被适配的类。q适配器提供客户类需要的接口,适配器提供客户类需要的接口,适配器的实现就是把客户类适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用的请求转化为对适配者的相应接口的调用。q也就是说:也就是说:当客户类调用适配器的方法时,在适配器类的内当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,部将调用适配者

7、类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。客户类并不直接访问适配者类。q因此,因此,适配器可以使由于接口不兼容而不能交互的类可以一适配器可以使由于接口不兼容而不能交互的类可以一起工作起工作。这就是适配器模式的模式动机。这就是适配器模式的模式动机。适配器模式适配器模式n模式定义模式定义q适配器模式适配器模式(Adapter Pattern) :将一个接口转换成客户:将一个接口转换成客户希望的另一个接口,适配器模式希望的另一个接口,适配器模式使接口不兼容的那些类使接口不兼容的那些类可以一起工作可以一起工作,其别名为,其别名为包装器包装器(Wrapper)或变压器或变压器。适

8、配器模式既可以作为类结构型模式,也可以作为对象适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。结构型模式。qConvert the interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. qFrequency of use: medium high适配器模式适配器模式n模式角色模式角色qTarget:目标抽象类:目标抽象类qAdapt

9、er:适配器类:适配器类qAdaptee:适配者(源角色)类:适配者(源角色)类qClient:客户类:客户类适配器模式适配器模式n模式结构模式结构q类适配器类适配器:适配器与适配者是继承关系适配器与适配者是继承关系Adapter+ request ().Target+ request ().Adaptee+ specificRequest ().ClientspecificRequest();适配器模式适配器模式n模式结构模式结构q对象对象适配器:适配器与适配者是关联关系适配器:适配器与适配者是关联关系adapteeAdapter+ request ().Adaptee+ specificR

10、equest ().Clientadaptee.specificRequest();Target+ request ().适配器模式适配器模式n模式实现模式实现q类适配器的典型代码类适配器的典型代码public class Adapter extends Adaptee implements Targetpublic void request()specificRequest();适配器模式适配器模式n模式实现模式实现q对象适配器代码的典型代码对象适配器代码的典型代码public class Adapter extends Targetprivate Adaptee adaptee;publi

11、c Adapter(Adaptee adaptee)this.adaptee=adaptee;public void request()adaptee.specificRequest(); 适配器模式适配器模式n例例1:仿生机器人:仿生机器人n现需要设计一个可以模拟各种动物行为的机器人,在机现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法机器人移动方法move()等。如果希望在不修改已有代码等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,使的基础上使得机器人能够像

12、狗一样叫,像狗一样跑,使用适配器模式进行系统设计用适配器模式进行系统设计适配器模式适配器模式n例例1:仿生机器人:仿生机器人 DogAdapter+cry ()move ().: void: voidRobot+cry ()move ().: void: voidDog+wang ()run ().: void: void适配器模式适配器模式n例例1:仿生机器人:仿生机器人q目标类:目标类:Robot接口接口 public interface Robotpublic void cry();public void move();适配器模式适配器模式n例例1:仿生机器人:仿生机器人q适配者类:适配

13、者类:dog类类 public class Dogpublic void wang()System.out.println(狗汪汪叫!狗汪汪叫!);public void run()System.out.println(狗快快跑!狗快快跑!);适配器模式适配器模式n例例1:仿生机器人:仿生机器人q适配器类:适配器类:dog类类 public class DogAdapter extends Dog implements Robotpublic void cry()System.out.print(机器人模仿:机器人模仿:);super.wang();public void move() Sys

14、tem.out.print(机器人模仿:机器人模仿:);super.run();适配器模式适配器模式n例例1:仿生机器人:仿生机器人q客户端客户端public class Clientpublic static void main(String args)Robot robot=(Robot)XMLUtil.getBean();robot.cry();robot.move(); DogAdapter适配器模式适配器模式n例例2:加密适配器:加密适配器q某系统需要提供一个加密模块,将用户信息(如密码等某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义

15、机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。好了数据库操作类。q为了提高开发效率,现需要重用已有的加密算法,这些为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源算法封装在一些由第三方提供的类中,有些甚至没有源代码。代码。q使用适配器模式设计该加密模块,实现在不修改现有类使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。的基础上重用第三方加密方法。适配器模式适配器模式n例例2:加密适配器:加密适配器ciphercipherDataOperatorabstract - password : String

16、+setPassword (String password)getPassword ()doEncrypt (int key, String ps).: void: String: StringCipherAdapter- cipher : Caesar+CipherAdapter ()doEncrypt (int key, String ps).: StringNewCipherAdapter- cipher : NewCipher+NewCipherAdapter ()doEncrypt (int key, String ps).: StringCaesar+ doEncrypt (int

17、 key, String ps).: StringNewCipher+ doEncrypt (int key, String ps).: String适配器模式适配器模式n例例2:加密适配器:加密适配器q目标类:目标类: DataOperationpublic abstract class DataOperationprivate String password;public void setPassword(String password)this.password=password;public String getPassword()return this.password;public

18、 abstract String doEncrypt(int key,String ps);适配器模式适配器模式n例例2:加密适配器:加密适配器q适配者类:适配者类: Caesarpublic final class Caesar public String doEncrypt(int key,String ps) String es=;for(int i=0;i=a&cz) c-=26;if(c=A&cZ) c-=26;if(cA) c+=26;es+=c;return es;适配器模式适配器模式n例例2:加密适配器:加密适配器q适配器类:适配器类: CipherAdapte

19、r public class CipherAdapter extends DataOperationprivate Caesar cipher;public CipherAdapter()cipher=new Caesar();public String doEncrypt(int key,String ps)return cipher.doEncrypt(key,ps);适配器模式适配器模式n例例2:加密适配器:加密适配器q新适配者类:新适配者类: NewCipherpublic final class NewCipherpublic String doEncrypt(int key,Str

20、ing ps) String es=;for(int i=0;ips.length();i+)String c=String.valueOf(ps.charAt(i)%key);es+=c;return es;适配器模式适配器模式n例例2:加密适配器:加密适配器q新适配器类:新适配器类: NewCipherAdapter public class NewCipherAdapter extends DataOperationprivate NewCipher cipher;public NewCipherAdapter()cipher=new NewCipher();public String

21、doEncrypt(int key,String ps)return cipher.doEncrypt(key,ps);适配器模式适配器模式n例例2:加密适配器:加密适配器q客户端类:客户端类: public class Clientpublic static void main(String args) DataOperation dao=(DataOperation)XMLUtil.getBean();dao.setPassword(sunnyLiu);String ps=dao.getPassword();String es=dao.doEncrypt(6,ps);System.out.

22、println(明文为:明文为: + ps);System.out.println(密文为:密文为: + es);适配器模式适配器模式n评价评价q总体优点:总体优点:n将目标类和适配者类解耦将目标类和适配者类解耦,通过引入一个适配器类来重用,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。现有的适配者类,而无需修改原有代码。n增加了类的透明性和复用性增加了类的透明性和复用性,将具体的实现封装在适配者,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的类中,对于客户端类来说是透明的,而且提高了适配者的复用性。复用性。n灵活性和扩展性都非常好灵活性和扩展性都非

23、常好,通过使用配置文件,可以很方,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合新的适配器类,完全符合“开闭原则开闭原则”。适配器模式适配器模式n评价评价q类适配器优点:类适配器优点:n由于适配器类是适配者类的子类,因此由于适配器类是适配者类的子类,因此可以在适配器类中可以在适配器类中置换一些适配者的方法置换一些适配者的方法,使得适配器的灵活性更强。,使得适配器的灵活性更强。q类适配器缺点:类适配器缺点:n对于对于Java、C#等不支持多重继承的语言,一次最多只能等不支持多重继承的语言,一次最

24、多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,为具体类,其使用有一定的局限性其使用有一定的局限性,不能将一个适配者类,不能将一个适配者类和它的子类都适配到目标接口。和它的子类都适配到目标接口。适配器模式适配器模式n评价评价q对象适配器优点:对象适配器优点:n一个对象适配器可以把多个不同的适配者适配到同一个目一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,标,也就是说,同一个适配器可以把适配者类和它的子类同一个适配器可以把适配者类和它的子类都适配到目标接口都适配到目标接口。q对象适配器缺点:对象适配器缺点:n与

25、类适配器模式相比,与类适配器模式相比,要想置换适配者类的方法就不容易要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。过程较为复杂。适配器模式适配器模式n评价评价q适用环境:适用环境:n系统系统需要使用现有的类需要使用现有的类,而,而这些类的接口不符合系这些类的接口不符合系统的需要统的需要。n想要建立一个

26、可以重复使用的类,用于与一些彼此想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类之间没有太大关联的一些类,包括一些可能在将来,包括一些可能在将来引进的类引进的类一起工作一起工作。适配器模式适配器模式n模式扩展模式扩展q缺省适配器模式缺省适配器模式(Default Adapter Pattern)n存在一个功能强大的接口,但很多时候只需要实现和使用存在一个功能强大的接口,但很多时候只需要实现和使用其中的一部分方法其中的一部分方法n可先设计一个可先设计一个抽象类实现接口抽象类实现接口,并,并为该接口中每个方法提为该接口中每个方法提供一个默认实现(空方法)。供一个默认实现(空方法

27、)。n然后,该抽象类的子类可有选择地覆盖父类的某些方法来然后,该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它实现需求,它适用于一个接口不想使用其所有的方法的情适用于一个接口不想使用其所有的方法的情况况。n这种方式称为缺省适配器模式,是适配器类型的简化,也这种方式称为缺省适配器模式,是适配器类型的简化,也称为称为单接口适配器模式单接口适配器模式。 适配器模式适配器模式n模式扩展模式扩展q缺省适配器模式缺省适配器模式n适配者接口适配者接口 n缺省适配器类缺省适配器类 n具体业务类具体业务类 适配器模式适配器模式n模式扩展模式扩展q缺省适配器模式缺省适配器模式WindowAdapterab

28、stract +windowOpened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated4 (WindowEvent e)windowStateChanged (WindowEvent e)windowGainedFocus (WindowEvent e)windowLostF

29、ocus (WindowEvent e): void: void: void: void: void: void: void: void: void: voidWindowListener+windowOpened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated (Window

30、Event e).: void: void: void: void: void: void: void适配器模式适配器模式n模式扩展模式扩展q双向适配器双向适配器 n在对象适配器的使用过程中,如果在对象适配器的使用过程中,如果在适配器中同时包含对在适配器中同时包含对目标类和适配者类的引用目标类和适配者类的引用,适配者可以通过它调用目标类适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法中的方法,目标类也可以通过它调用适配者类中的方法,那么该适配器就是一个那么该适配器就是一个双向适配器双向适配器。适配器模式适配器模式n模式扩展模式扩展q双向适配器双向适配器 adaptee

31、targetAdapter-adapteetarget: Adaptee: Target+request ()specificRequest ()setTarget (Target target)setAdaptee (Adaptee adaptee).Target+ request ().adaptee.specificRequest();Adaptee+ specificRequest ().target.request();ConcreteTarget+ request ().ConcreteAdaptee+ specificRequest ().桥接模式桥接模式n意图意图桥接模式桥接模

32、式n意图意图q现需要提供大中小现需要提供大中小3种型号的画笔,能够绘制种型号的画笔,能够绘制5种不同颜种不同颜色。色。如果使用蜡笔,需要多少支蜡笔?如果使用蜡笔,需要多少支蜡笔?如果使用毛笔,需要多少支毛笔?如果使用毛笔,需要多少支毛笔?毛笔和蜡笔的区别是什么?毛笔和蜡笔的区别是什么?桥接模式桥接模式n意图意图q设想如果要绘制矩形、圆形、椭圆、正方形,我们设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要至少需要4个形状类,但是如果绘制的图形需要具个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:有如

33、下两种设计方案: n第一种设计方案是为每一种形状都提供一套各种颜色的版第一种设计方案是为每一种形状都提供一套各种颜色的版本。本。n第二种设计方案是根据实际需要对形状和颜色进行组合。第二种设计方案是根据实际需要对形状和颜色进行组合。 桥接模式桥接模式n意图意图12桥接模式桥接模式n意图意图q对于有对于有两个变化维度两个变化维度(即两个变化的原因)的系统,采(即两个变化的原因)的系统,采用用方案二方案二来进行设计系统中类的个数更少,且系统扩展来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。更为方便。设计方案二即是桥接模式的应用。q桥接模式桥接模式将继承关系转换为关联

34、关系将继承关系转换为关联关系,从而,从而降低了类与降低了类与类之间的耦合类之间的耦合,减少了代码编写量减少了代码编写量。 桥接模式桥接模式n意图意图桥接模式桥接模式n模式定义模式定义n桥接模式桥接模式(Bridge Pattern):将抽象部分与它的实现部分将抽象部分与它的实现部分分离,使它们都可以独立地变化分离,使它们都可以独立地变化。它是一种对象结构型。它是一种对象结构型模式,又称为柄体模式,又称为柄体(Handle and Body)模式或接口模式或接口(Interface)模式。模式。nBridge Pattern: Decouple an abstraction from its i

35、mplementation so that the two can vary independently. nFrequency of use: medium桥接模式桥接模式n模式定义模式定义q桥接模式的核心在于桥接模式的核心在于抽象化抽象化与与实现化实现化 脱耦脱耦。q抽象化抽象化:在面向对象中,:在面向对象中,将对象的共同性质抽取出来形成类的过将对象的共同性质抽取出来形成类的过程程即为抽象化的过程。即为抽象化的过程。 q实现化实现化:针对抽象化给出的具体实现,就是实现化。针对抽象化给出的具体实现,就是实现化。实现化产生实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。的对

36、象比抽象化更具体,是对抽象化事物的进一步具体化的产物。q脱耦脱耦:脱耦就是:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联将它们之间的强关联改换成弱关联,将两个角色之间的继承关系将两个角色之间的继承关系改为关联关系改为关联关系q简单地说:脱耦,就是在软件系统的抽象化和实现化之间使用关简单地说:脱耦,就是在软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系(合成复用原则)。联关系(组合或者聚合关系)而不是继承关系(合成复用原则)。 桥接模式桥接模式n模式结构模式结构implClientAbstra

37、ction+ operation ().Implementor+ operationImpl ().RefinedAbstraction+ operation ().ConcreteImplementorA+ operationImpl ().ConcreteImplementorB+ operationImpl ().桥接模式桥接模式n角色:角色:qAbstraction:抽象类:抽象类qRefinedAbstraction:扩充抽象类:扩充抽象类qImplementor:实现类接口:实现类接口qConcreteImplementor:具体实现类:具体实现类 桥接模式桥接模式n模式实现模式实

38、现qImplementor实现类接口代码:实现类接口代码:public interface Implementorpublic void operationImpl(); 桥接模式桥接模式n模式实现模式实现qAbstraction抽象类代码:抽象类代码:public abstract class Abstractionprotected Implementor impl;public void setImpl(Implementor impl)this.impl=impl;public abstract void operation(); 桥接模式桥接模式n模式实现模式实现qRefinedAb

39、straction扩充抽象类代码:扩充抽象类代码:public class RefinedAbstraction extends Abstractionpublic void operation()/代码代码impl.operationImpl();/代码代码 桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔q现需要提供大中小现需要提供大中小3种型号的画笔,能够绘制种型号的画笔,能够绘制5种不同颜种不同颜色。色。q如果使用蜡笔,我们需要准备如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说支蜡笔,也就是说必须准备必须准备15个具体的蜡笔类。个具体的蜡笔类。q而如果使用毛笔的话,只需要而如果使用

40、毛笔的话,只需要3种型号的毛笔,外加种型号的毛笔,外加5个个颜料盒,用颜料盒,用3+5=8个类就可以实现个类就可以实现15支蜡笔的功能。支蜡笔的功能。q本实例使用桥接模式来模拟毛笔的使用过程。本实例使用桥接模式来模拟毛笔的使用过程。桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔colorPenabstract # color : Color+setColor (Color color)draw (String name).: void: voidColor+ bepaint (String penType, String name).: voidSmallPen+ draw (String na

41、me).: voidRed+ bepaint (String penType, String name).: voidMiddlePen+ draw (String name).: voidBigPen+ draw (String name).: voidGreen+ bepaint (String penType, String name).: voidBlue+ bepaint (String penType, String name).: voidWhite+ bepaint (String penType, String name).: voidBlack+ bepaint (Stri

42、ng penType, String name).: void桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔qAbstraction抽象类抽象类public abstract class Penprotected Color color;public void setColor(Color color)this.color=color;public abstract void draw(String name); 桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔qRefinedAbstraction扩充抽象类扩充抽象类n大号毛笔大号毛笔public class BigPen extends Penp

43、ublic void draw(String name)String penType=大号毛笔画大家伙大号毛笔画大家伙:;this.color.bepaint(penType,name);桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔qRefinedAbstraction扩充抽象类扩充抽象类n中号毛笔中号毛笔public class MiddlePen extends Penpublic void draw(String name)String penType=“一般的图形用中号毛笔一般的图形用中号毛笔:;this.color.bepaint(penType,name);桥接模式桥接模式n例例1

44、:模拟毛笔:模拟毛笔qRefinedAbstraction扩充扩充抽象类抽象类n小号毛笔小号毛笔public class SmallPen extends Penpublic void draw(String name)String penType=“小号毛笔画精细图像小号毛笔画精细图像:;this.color.bepaint(penType,name);桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔qImplementor实现类接口实现类接口n颜色接口颜色接口public interface Colorvoid bepaint(String penType,String name);桥接模式桥

45、接模式n例例1:模拟毛笔:模拟毛笔qConcreteImplementor:具体实现类:具体实现类n红色红色public class Red implements Colorpublic void bepaint(String penType,String name)System.out.println(penType + 红色的红色的+ name + .);桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔qConcreteImplementor:具体实现类:具体实现类n黑色黑色public class Black implements Colorpublic void bepaint(Strin

46、g penType,String name)System.out.println(penType + 黑色的黑色的+ name + .);其他颜色类似其他颜色类似桥接模式桥接模式n例例1:模拟毛笔:模拟毛笔q客户端类客户端类public class Clientpublic static void main(String a)Color color;Pen pen;color=(Color)XMLUtilPen.getBean(color);pen=(Pen)XMLUtilPen.getBean(pen);pen.setColor(color);pen.draw(鲜花鲜花); White Sm

47、allPen桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q某公司,原来是做房地产的,通常都是豆腐渣。国某公司,原来是做房地产的,通常都是豆腐渣。国家调控以后,生存不易,决定转向家调控以后,生存不易,决定转向IT行业。行业。q不会做,怎么办?老板说不会做,怎么办?老板说“没关系,先做山寨没关系,先做山寨”,随便找几个人,先山寨随便找几个人,先山寨IPodq用桥接模式模拟该过程用桥接模式模拟该过程n要可以随意更换山寨产品要可以随意更换山寨产品n有一天有实力了,要能够做改头换面,生产好的产品有一天有实力了,要能够做改头换面,生产好的产品桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我

48、怕谁桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q抽象实现类抽象实现类桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q具体实现类具体实现类桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q具体实现类具体实现类桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q抽象类:公司抽象类:公司桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q扩充抽象类:房地产公司扩充抽象类:房地产公司桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q扩充抽象类:山寨公司扩充抽象类:山寨公司桥接模式桥接模式n例例2:我是山寨我怕谁:我是山寨我怕谁q客户端客户端桥接模式桥

49、接模式n评价评价q优点优点n分离抽象接口及其实现部分分离抽象接口及其实现部分。n桥接模式有时类似于多继承方案,但是多继承方案违背了桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,用性比较差,而且多继承结构中类的个数非常庞大,桥接桥接模式是比多继承方案更好的解决方法模式是比多继承方案更好的解决方法。 n桥接模式桥接模式提高了系统的可扩充性提高了系统的可扩充性,在两个变化维度中任意,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。扩展一个维度,

50、都不需要修改原有系统。n实现细节对客户透明,可以对用户隐藏实现细节实现细节对客户透明,可以对用户隐藏实现细节。 桥接模式桥接模式n评价评价q缺点缺点n桥接模式的引入会桥接模式的引入会增加系统的理解与设计难度增加系统的理解与设计难度,由,由于聚合关联关系建立在抽象层,要求开发者针对抽于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。象进行设计与编程。n桥接模式要求正确识别出系统中两个独立变化的维桥接模式要求正确识别出系统中两个独立变化的维度,因此度,因此其使用范围具有一定的局限性其使用范围具有一定的局限性。 桥接模式桥接模式n评价评价q适用环境:适用环境:n如果系统如果系统需要在构件

51、的抽象化角色和具体化角色之间增加灵活性需要在构件的抽象化角色和具体化角色之间增加灵活性,避免静态的继承联系避免静态的继承联系,桥接模式可以在抽象层建立关联关系。,桥接模式可以在抽象层建立关联关系。n抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将抽象化子类的对象和实现化子类的对象在程序运行时可以动态将抽象化子类的对象和实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。n一个类一个类存在两个独立变化的维度存在两个独立变化的维度,

52、且两个维度都需要进行扩展。,且两个维度都需要进行扩展。n虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。体化角色需要独立变化,设计要求需要独立管理这两者。n对于那些对于那些不希望使用继承或因为多层次继承导致系统类的个数急不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统剧增加的系统,桥接模式尤为适用。,桥接模式尤为适用。桥接模式桥接模式n模式扩展模式扩展q适配器模式与桥接模式的联用适配器模式与桥接模式的联用 n桥接模式和适配器模式用于设计的不同阶段,桥接模式和适配器模式用

53、于设计的不同阶段,桥接模式用桥接模式用于系统的初步设计于系统的初步设计,对于存在两个独立变化维度的类可以,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行将其分为抽象化和实现化两个角色,使它们可以分别进行变化;变化;n而在初步设计完成之后,而在初步设计完成之后,当发现系统与已有类无法协同工当发现系统与已有类无法协同工作时,可以采用适配器模式作时,可以采用适配器模式。但有时候在设计初期也需要。但有时候在设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况。的情况。桥接模式桥接模式n模式扩展模式扩

54、展q适配器模式与桥接模式的联用适配器模式与桥接模式的联用桥接模式桥接模式n典型应用典型应用qJava虚拟机虚拟机桥接模式桥接模式n典型应用典型应用q类似的,许多跨平台软件类似的,许多跨平台软件n如:视频播放器如:视频播放器Abstract MethodvfOperatingSystemVersionabstract # vf : VideoFile+setVideoFile (VideoFile vf)play (String fileName).: void: voidVideoFile+ decode (String osType, String fileName).: voidWindo

55、wsVersion+ play (String fileName).: voidMPEGFile+ decode (String osType, String fileName).: voidLinuxVersion+ play (String fileName).: voidUnixVersion+ play (String fileName).: voidRMVBFile+ decode (String osType, String fileName).: voidWMVFile+ decode (String osType, String fileName).: voidAVIFile+

56、 decode (String osType, String fileName).: void组合模式组合模式n意图意图q情人节的礼物情人节的礼物组合组合组合模式组合模式n意图意图q更复杂的组合:企业的组织结构更复杂的组合:企业的组织结构组合模式组合模式n意图意图组合模式组合模式n意图意图q组合模式是一个处理组合模式是一个处理树形结构树形结构的模式。的模式。 树:树:分支结点分支结点和和叶子结点叶子结点, 组合模式:组合模式:容器对象容器对象和和叶子对象叶子对象q组合模式描述了组合模式描述了如何将容器对象和叶子对象进行递归组如何将容器对象和叶子对象进行递归组合合,即,即整体整体-部分部分的关系

57、的关系组合模式组合模式n意图意图q由于容器对象和叶子对象在功能上的区别,在使用这些由于容器对象和叶子对象在功能上的区别,在使用这些对象的客户端代码中必须对象的客户端代码中必须有区别地对待容器对象和叶子有区别地对待容器对象和叶子对象对象,而实际上,而实际上大多数情况下客户端希望一致地处理它大多数情况下客户端希望一致地处理它们们,因为对于这些对象的区别对待将会使得程序非常复因为对于这些对象的区别对待将会使得程序非常复杂杂。q组合模式使得客户端把一个个组合模式使得客户端把一个个单独的成分对象单独的成分对象和由他们和由他们复合而成的合成对象同等看待复合而成的合成对象同等看待。使得。使得用户在使用时无须

58、用户在使用时无须对它们进行区分对它们进行区分,可以,可以一致地对待容器对象和叶子对象一致地对待容器对象和叶子对象。组合模式组合模式n模式定义模式定义q组合模式组合模式(Composite Pattern):组合多个对象形成:组合多个对象形成树形树形结构结构以以表示表示“整体整体-部分部分”的结构层次的结构层次。组合模式对。组合模式对单单个对象(即叶子对象)个对象(即叶子对象)和和组合对象(即容器对象)组合对象(即容器对象)的的使使用具有一致性用具有一致性。q组合模式又可以称为组合模式又可以称为“整体整体-部分部分”(Part-Whole)模式模式,属于对象的结构模式,它属于对象的结构模式,它将

59、对象组织到树结构中,可以将对象组织到树结构中,可以用来描述整体与部分的关系用来描述整体与部分的关系。组合模式组合模式n模式定义模式定义qComposite Pattern: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. q Frequency of use: medium high 组合模式组合模式n模式角色模式角色qCo

60、mponent: 抽象构件抽象构件qLeaf: 叶子构件叶子构件qComposite: 容器构件容器构件(分支构件)分支构件)qClient: 客户类客户类组合模式组合模式n模式结构模式结构childrenClientComponent+operation ()add (Component c)remove (Component c)getChild (int i).Leaf+ operation ().Composite+operation ()add (Component c)remove (Component c)getChild (int i).for(Component child:children

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论