7.1 设计模式概述
7.2 单例模式
(1)模式名称
单例模式。
(2)问题与分析
问:
对于调用者,如何才能做到确保代码中的某个类只存在一个实例,而且实例一旦创建,就可以向整个运行程序提供全局访问的方法,由全局程序共享。
答:
需要定义一个特殊的类,该类能够实现这样几种特性。一是这个类只能有一个实例,即便再次创建实例,该类也能够保证返回的是同一个实例对象,而不是再创建出的新实例对象。二是这个类必须能够在内部控制实例的创建,而不是放给调用者任意创建。三是这个类能够被全局访问和共享。
(3)解决方案
定义一个单例类A,该类是私有可见度(Private),使得在类外部不可以直接创建类实例,类定义一个静态方法GET_INSTANCE,用于通过调用类来创建和返回该类的唯一的实例,而不是通过调用对象。
第一次调用GET_INSTANCE方法时将创建唯一的实例,第二次以上调用GET_INSTANCE方法时,方法会返回第一次创建时的实例对象,这样就保证了系统中只存在唯一的实例对象。
7.3 简单工厂模式
1)模式名称
简单工厂模式。
(2)问题与分析
问:
对于调用者,如何才能做到不用关心制造的细节,只要传入一个正确的参数,就可以获取所需要的对象?
答:
我们需要一个工厂一样的类对象,根据传入的参数,生产出需要的对象实例。
(3)解决方案
定义一个工厂类A,它可以根据参数的不同来返回不同类的实例,比如传入工厂类方法参数字符串“B1”,类工厂就会创建对应的对象B1。
被创建的实例通常都具有共同的父类,如抽象产品类B。在简单工厂模式中,用于创建实例的方法可以是静态方法(即不用创建工厂类对象实例就可以开工生产的模式),简单工厂模式又被称为静态工厂方法(StaticFactory Method)模式。
7.4 适配器模式
出国旅游或出差时会发现,很多国家的电压和插头的标准与国内的都不一样,这就需要我们再购买一个带插头的转接头,即适配器。
(1)模式名称
适配器模式。
(2)问题与分析
问:
如何才能把一个程序或类的调用方式转换成调用程序所需要的形式,从而使两个不匹配的类或者代码能够一起工作?
答:
需要在两个程序或者类之间,设置一个新的类,用于翻译两者之间不同的调用方式。
(3)解决方案
为了使得两个类能够互相调用,我们需要增加一个适配器类来解决调用接口不兼容的问题,以使得原本没有直接关系的类可以进行互相调用的操作。
7.5 桥接模式
奥地利设计生产的斯太尔(AUG)步枪,采用了模块化设计,短时间内可以将枪管和部件进行拆卸和组合,使得它可以变成冲锋枪、突击步枪、轻机枪,可以用于巷战、进攻、压制等不同目的的作战
(1)模式名称
桥接模式。
(2)问题与分析
问:
如何避免用复杂的继承来描述业务?如何用组合和关联来提高灵活性?
答:
采用组合来替代多层的继承,将类之间的继承关系转换为动态的组合关系,使得系统更加灵活,并且易于扩展,同时还可以降低系统中类定义的数量。
(3)解决方案
通过业务分析,将业务描述从多个维度拆分并展开,使对象可以在不同的维度上独立变化,然后再根据需要组合这些维度,形成所需要的结构模型。也就是通过先拆再连的过程,达成灵活组合的目的。
7.6 外观模式
7.7 观察者模式
当一个对象的状态发生改变时,这个对象相关依赖的所有对象都可以得到通知并能够自动更新的行为模式就是观察者模式(Observer Pattern)。
(1)模式名称
观察者模式。
(2)问题与分析
问:
当一个对象状态发生改变之后,应如何向其他相关的对象发送变化的通知呢?
答:
定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都可以得到通知并执行相关的动作。
(3)解决方案
定义一个被观察者和多个观察者,并将这些观察者联系到相应的被观察者,当被观察者的状态发生改变时,调用方法逐一地通知观察者对象。
我们利用SAP ABAP的Event(事件功能),那么我们可以更方便地获得相同的效果。
如图7-77所示是采用Event事件的过程,其中的类关系具体如下。
·被监听者类ZCL_SUBJECT设定了事件STATUS_CHANGED。
·观察者类ZCL_OBSERVER,观察并响应被监听者ZCL_SUBJECT的事件。
7.8 策略模式
义一系列的算法,将每一个算法都封装起来,并根据需要可以灵活调用或替换算法,让算法独立于我们的调用程序,那么这样的一个模式就是策略模式(Strategy Pattern)。
(1)模式名称
策略模式。
(2)问题与分析
问:
当调用者使用算法进行计算时,怎样才能不影响调用者的调用,而对算法进行替换操作?
答:
将算法的定义与使用分开,让调用者依赖于抽象的算法定义的抽象类(依赖倒置原则),当出现新的算法时,只需要增加一个新的实现类即可。
(3)解决方案
定义一个抽象的算法类,然后定义一系列的算法实现类,这些实现类可以相互替换,这样就可以让算法独立于调用者的调用。
7.9 设计模式总结
采用设计模式时有如下建议。
1)SAP ABAP中使用设计模式要采用面向对象的ABAP,并充分利用动态参数(括号运算符)功能,根据动态传入的类类型,在运行时动态创建对象。
2)SAP ABAP中要采用自定义数据库表来存储业务配置,这样才能发挥出设计模式的业务可配置的灵活性。
3)对复杂的和上层的业务逻辑考虑使用设计模式,对简单的、底层的程序实现则不用考虑。
4)首先考虑业务实现,然后再看能否应用设计模式,设计模式是为人服务的,不要为了设计模式而设计模式。
5)设计模式是为了能够达到代码的重用和问题的解耦,减少复杂度和相互依赖,提高程序的稳定性和可维护性。
6)能用简单的模式解决的问题就不要引入复杂的模式。
7)相比实现一个模式,遵守面向对象的基本原则往往是更重要的。
8)设计模式不是“银弹”,它们能够帮助设计出稳定的程序,但不能解决所有的问题。