Java模式.ppt
Java与模式与模式第一节第一节门面模式门面模式一、门面模式定义一、门面模式定义外部与一个子系统的通信必须通过一个统一的门面外部与一个子系统的通信必须通过一个统一的门面(Facade)对象对象进行,这就是门面模式。进行,这就是门面模式。举个例子:在做项目或产品的过程中进行跨部门合作的时候,每举个例子:在做项目或产品的过程中进行跨部门合作的时候,每个部门都有个相应的接口人,那么我们只需和对应部门的接口人交互即个部门都有个相应的接口人,那么我们只需和对应部门的接口人交互即可,门面模式也一样,门面模可,门面模式也一样,门面模式提供一个高层次的接口,使得子系统式提供一个高层次的接口,使得子系统更易于使用。更易于使用。二、门面模式的角色组成(二、门面模式的角色组成(3个):个):1、门面角色(门面角色(facade):这是门面模式的核心。它被客户角色调):这是门面模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。了几种功能组合。2、子系统角色:实现了子系统的功能。对它而言,、子系统角色:实现了子系统的功能。对它而言,facade角色就角色就和客户角色一样是未知的,它没有任何和客户角色一样是未知的,它没有任何facade角色的信息和链接。角色的信息和链接。3、客户角色:调用、客户角色:调用facade角色来完成要得到的功能角色来完成要得到的功能三、三、门面模式的结构门面模式的结构门面模式是对象的结构模式。门面模式没有一个一般化的类图描述,门面模式是对象的结构模式。门面模式没有一个一般化的类图描述,下图演示了一个门面模式的示意性对象图:下图演示了一个门面模式的示意性对象图:在这个对象图中,出现了两个角色:在这个对象图中,出现了两个角色:门面门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓角色:客户端可以调用这个角色的方法。此角色知晓相关的相关的(一个或者多个一个或者多个)子系统的功能和责任。在正常情况下,本角色会将子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。所有从客户端发来的请求委派到相应的子系统去。四、特点四、特点1、子系统的独立性:、子系统的独立性:子系统对外提供一个统一简单的接口,可子系统对外提供一个统一简单的接口,可以减少系统间的耦合性,提高子系统的独立性和可移植性。以减少系统间的耦合性,提高子系统的独立性和可移植性。2、系统的层次性:在构建一个层次化的系统时,可以使用、系统的层次性:在构建一个层次化的系统时,可以使用Facade模式定义系统中每一层的入口。如果层与层之间是相互模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过依赖的,则可以限定它们仅通过Facade进行通信,从而简化层进行通信,从而简化层与层之间的依赖关系与层之间的依赖关系模式应用模式应用:Facade一个典型应用就是进行数据库连接。一般我们在每一次对一个典型应用就是进行数据库连接。一般我们在每一次对数据库进行访问,都要进行以下操作:先得到数据库进行访问,都要进行以下操作:先得到connect实例,然后打实例,然后打开开connect获得连接,得到一个获得连接,得到一个statement,执行,执行sql语句进行查询,语句进行查询,得到查询结果集。得到查询结果集。我们可以将这些步骤提取出来,封装在一个类里面。这样,每次执我们可以将这些步骤提取出来,封装在一个类里面。这样,每次执行数据库访问只需要将必要的参数传递到这个类中就可以了。行数据库访问只需要将必要的参数传递到这个类中就可以了。举一个通俗的例子,购买衣服、电器、首饰举一个通俗的例子,购买衣服、电器、首饰,按传统方式是一个一个商按传统方式是一个一个商店的购买,但是如果引进门面模式,那我们就可以先建立一个购物中心,店的购买,但是如果引进门面模式,那我们就可以先建立一个购物中心,然后把这些商店都开在里面,只要在购物中心内一次性购买就行。然后把这些商店都开在里面,只要在购物中心内一次性购买就行。五、总结五、总结从客户程序的角度来看,从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦解耦”的效果的效果内部子系统的任何变化不会影响到内部子系统的任何变化不会影响到Faade接口的变化。接口的变化。Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。次。Facade很多时候更是一种架构设计模式。很多时候更是一种架构设计模式。第二节第二节装饰模式装饰模式一、装饰模式的定义一、装饰模式的定义装饰模式是在不必改变原类文件和使用继承的情况下,动态装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。饰来包裹真实的对象。装饰模式是对对象功能增强时,平时使用继承的一种替代方案装饰模式是对对象功能增强时,平时使用继承的一种替代方案装饰器涉及四个名词装饰器涉及四个名词1、接口或者抽象基类、接口或者抽象基类2、被装饰对象,也就是一个简单的实现了、被装饰对象,也就是一个简单的实现了1中提到的接口或者抽象基中提到的接口或者抽象基类的实现类。类的实现类。3、装饰对象,就是去装饰被装饰对象的对象、装饰对象,就是去装饰被装饰对象的对象4、继承装饰对象类的子类,也就是具体的装饰器类了。、继承装饰对象类的子类,也就是具体的装饰器类了。装饰模式的特点:装饰模式的特点:(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以以和装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。真实对象相同的方式和装饰对象交互。(2)装饰对象包含一个真实对象的引用(装饰对象包含一个真实对象的引用(reference)(3)装饰对象接受所有的来自客户端的请求。它把这些请求转发给真装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。实的对象。(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。扩展。总结总结1、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内部调用,则不能使用该模式。部调用,则不能使用该模式。2、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能发生变化,而你又懒得去改变原来的类,那么就可以考虑使用装饰器模式了。发生变化,而你又懒得去改变原来的类,那么就可以考虑使用装饰器模式了。优点:装饰模式和继承都是对功能的扩展优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合而装饰模式使用的是组合,可以不用继承可以不用继承而达到这一效果而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性使用过多的继承会增加系统的复杂性和偶合性缺点:装饰模式要产生一些辅助性的对象缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像但这些对象看上去都比较像,不是很容易不是很容易检查检查(好的命名应该是提高检查的一个办法好的命名应该是提高检查的一个办法)第三节第三节工厂模式工厂模式一、工厂模式定义一、工厂模式定义:提供创建对象的接口提供创建对象的接口.工厂模式:主要用来实例化有共同接口的类,可以动态决定应该实例化哪一个工厂模式:主要用来实例化有共同接口的类,可以动态决定应该实例化哪一个类。类。工厂模式有三个参与者,抽象产品工厂模式有三个参与者,抽象产品(Product)、工厂、工厂(Creator)和具体产品和具体产品(ConcreteProduct)。二、工厂模式的形态二、工厂模式的形态工厂模式主要用一下工厂模式主要用一下3种形态:种形态:1:简单工厂简单工厂(SimpleFactory)模式模式。2:工厂方法工厂方法(FactoryMethod)模式模式,又称多形性工厂又称多形性工厂(PolymorphicFactory)模式模式。3:抽象工厂抽象工厂(AbstractFactory)模式模式,又称工具箱又称工具箱(Kit或或Toolkit)模式模式。在简单工厂模式中在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上一个工厂类处于对产品类实例化调用的中心位置上,它决定那它决定那一个产品类应当被实例化一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中如同一个交通警察站在来往的车辆流中,决定放行那一决定放行那一个方向的车辆向那一个方向流动一样。个方向的车辆向那一个方向流动一样。工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给子类去作。这个决定被交给子类去作。工厂方法模式和简单工厂模式在定义上的不同是很明工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类显的。工厂方法模式的核心是一个抽象工厂类,而不像简单而不像简单工厂模式工厂模式,把核心放在一个实类上。工厂方法模式可以允许把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来很多实的工厂类从抽象工厂类继承下来,从而可以在实际上从而可以在实际上成为多个简单工厂模式的综合成为多个简单工厂模式的综合,从而推广了简单工厂模式。从而推广了简单工厂模式。反过来讲反过来讲,简单工厂模式是由工厂方法模式退化而来。简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类设想如果我们非常确定一个系统只需要一个实的工厂类,那那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。我们就退化到简单工厂模式了。抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛性的一种形态,抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛性的一种形态,抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。如下图:抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。如下图:在抽象工厂模式中,抽象产品在抽象工厂模式中,抽象产品(AbstractProduct)可可能是一个或多个,从而构成一个或多个产品族能是一个或多个,从而构成一个或多个产品族(ProductFamily)。在只有一个产品族的情况下,抽象工厂模式实际在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。上退化到工厂方法模式。总结:总结:简单工厂模式简单工厂模式是由一个具体的类去创建其他类的实例,是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。父类是相同的,父类是具体的。工厂方法模式工厂方法模式是有一个抽象的父类定义公共接口,子类是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。迟到子类中完成。抽象工厂模式抽象工厂模式提供一个创建一系列相关或相互依赖对象提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。的等级结构。而工厂方法模式针对的是一个产品的等级结构。