java design model

责任链模式

定义:有多个对象,每个对象持有下一个对象的引用,这样就形成了一条链,请求在这条链上传递,直到某个对象处理了该请求,但是请求的发出者并不知道是哪个对象处理了该请求,所以,在这里我们可以发现责任链模式可以在隐瞒客户端的情况下对系统的逻辑进行动态调整。

优缺点:责任链模式将请求和处理的逻辑进行了分离,发出请求的客户端并不知道责任链上的哪一个环节会处理请求,这样使得可以在不影响客户端的情况下从新组合服务端的逻辑,提高了系统的灵活性和可扩展性。

至于缺点也很明显,每次处理请求都要从责任链的开头进行。

策略模式

定义:策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则:

找出应用中相同之处,且不容易发生变化的东西,把它们抽象到抽象类中,让子类去继承它们;

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

策略模式的三个对象:

(1)  环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。

(2)  抽象策略对象:它可由接口或抽象类来实现。

(3)  具体策略对象:它封装了实现不同功能的不同算法。

策略模式的好处是让你可以动态地改变对象的行为。

外观模式

门面模式的优点

(1)  松散耦合

门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

(2)  简单易用

门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

(3)  更好地划分访问层次

通过使用Façade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

门面模式的角色

门面角色(Facade):客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。

子系统角色(Sub System):可以同时有一个或者多个子系统。每个子系统不是一个类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已

简单工厂模式

(1)抽象运算类

(2)加法运算类

(3)减法运算类

(4)运算工厂类

(5)测试类

 

装饰者模式

装饰者模式的使用场景

(1)在不影响其他对象的情况下,以动态地,透明地方式给对象添加功能。

(2)处理一些可以撤销的职责。

(3)当不能采用生成子类的方式进行扩展的时候,就可以使用装饰者模式。有两种情况可以使用装者模式,一种是:可能有大量的扩展,如果要扩展这些功能,可能会造成太多的子类。另一种是,不允许有子类的情况。

实现装饰者模式需要注意以下几点:

(1)装饰者和被装饰者其实都继承自相同的类,也就是抽象被装饰者。

(2)装饰者持有被装饰者。

(3)使用装饰者的对象,最终都会调用被装饰者对应的方法。

(4)不需要使用继承。

装饰者模式所涉及的对象

(1)抽象被装饰者:定义装饰者和被装饰者的公共方法。这里需要注意的有两点,第一点是:这个抽象被装饰者建议使用接口。第二点是无论装饰者还是被装饰者都需要继承这个抽象被装饰者。

(2)具体被装饰者:集成自抽象被装饰者,并且实现自己需要实现的方法。

(3)抽象装饰者:抽象类,并且持有被装饰者,并且在自己的方法中需要调用被装饰者的相应方法。

(4)具体装饰者:这里需要注意的是这个对象是给自己持有的具体被装饰者增加需要的装饰行为。简单点说就是在自己的方法中不仅仅要调用父类的方法,因为父类的方法最终会调用相应的被装饰者的方法。同时还需要实现自己对应的装饰行为。

工厂模式

定义

所谓工厂模式主要是为了创建对象提供过度接口,将创建对象的过程隔离起来,达到提高灵活性的目的。

分类

(1)简单工厂模式,不利于产生系列产品。

(2)工厂方法模式,又称为多形性工厂。

(3)抽象工厂模式,又称为工具箱,产生产品簇,但是不利于产生新的产品。

简单工厂模式

简单工厂模式又叫做静态工厂方法模式,这中间起核心作用的一个类便是产品工厂类,里面包含有一定的业务逻辑,然后根据相应的逻辑来产生对应的产品。

(1)包含的角色

A、抽象产品类,主要是定义产品的接口或者抽象类。

B、具体产品类,继承或者实现了抽象产品。

C、简单工厂类,主要用于根据一定的业务逻辑产生对应的产品。

原型模式

原型模式包含的角色

我们可以看见其他模式都采用了继承或者多态的技术,而这里的原型模式是设计模式中比较简单的一种设计模式,因为没有使用继承和多态,而且模式的成员也比较简单。

(1)抽象原型类:声明了一个克隆自身的接口。

(2)具体原型类:实现了具体的克隆自身的操作。

在开发过程中,我们常常会遇到需要创建多个实例的情况,而这些实例的都是相同的或者大部分内容是相同的,那么这个时候如果我们全部使用new()的方法来创建这些实例,将会花很多时间去创建,那么有没有更好的方法呢?当然有,我们可以使用复制(即clone)的方法来创建实例。这里就该我们要讲到的原型模式上场了。

模板方法模式

定义一个算法中的操作框架,而将算法中的一些步骤进行抽象,使这些步骤延迟到子类中去实现,从而实现子类不改变算放结构就可以重定义算法的某些特定步骤。

模板方法模式的优缺点
(1)优点

封装不变部分,扩展可变部分。
提取公共部分代码便于维护。
行为由父类控制,子类实现。
(2)缺点

按照一般的设计思路,抽象类负责完成最基础的方法,而具体的方法使用及实现由子类完成。而模板方法模式的设计思路正好相反,这样会增加代码的阅读难度。

使用场景

(1)多个子类有相同的方法,并且基本逻辑相同。

(2)重要的、复杂的算法,可以将核心算法抽象成模板,然后子类实现周边算法。

(3)针对重构的时候,可以将相同的算法抽象成模板,针对不同的部分由子类实现。

 

posted @ 2019-04-14 21:23  jk212  阅读(170)  评论(0编辑  收藏  举报