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