本文整合自两篇网文,略做加工,以与前篇保持统一风格.
原文地址: http://tech.it168.com/a2009/0731/616/000000616596.shtml / http://hi.baidu.com/oabap/item/396ef07827a99a10d0dcb3dd
首先介绍策略模式的基本内容
1. 意图:
定义一系列算法,把他们一个个的封装起来,并且使他们可以互相替换.本模式可以使得算法可以独立于使用他的客户而变化.
2. 结构:
3. 适用性:
1).许多相关的类仅仅是行为有异.
2).需要使用一个算法的不同变体.
3).一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现.
4. 参与者:
1).Strategy
定义所支持的算法的公共接口.context使用这个接口来调用某个concrete strategy所定义的算法.
2).ConcreteStrategy
以strategy接口实现具体的算法
3).context
用一个concretestrategy对象来配置维护一个strategy对象的引用, 可定义一个接口来让strategy访问它的数据
5. 效果
1).相关算法系列
2).一个替代继承的方法
3).消除一系列条件语句
Note:
对于效果,我想在以后的例子中就会有所体现,现在只是基本的定义以及结构,所以看上去有些晦涩难懂,不过不要着急,慢慢的就能理解了.
策略模式的例子(UML类图):
程序代码:
REPORT zgary_t014. INCLUDE zgary_t014_define. START-OF-SELECTION. DATA: grf_mallard_duck TYPE REF TO lcl_mallard_duck. CREATE OBJECT grf_mallard_duck. CALL METHOD grf_mallard_duck->performquack. CALL METHOD grf_mallard_duck->performfly. CALL METHOD grf_mallard_duck->display. *&---------------------------------------------------------------------* *& Include ZGARY_T014_DEFINE *&---------------------------------------------------------------------* INTERFACE li_fly_behavior. METHODS fly. ENDINTERFACE. " *----------------------------------------------------------------------* * INTERFACE li_quack_behavior *----------------------------------------------------------------------* * *----------------------------------------------------------------------* INTERFACE li_quack_behavior. METHODS quack. ENDINTERFACE. " *----------------------------------------------------------------------* * CLASS lcl_Duck DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_duck DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: performfly, performquack, display ABSTRACT. PROTECTED SECTION. DATA: fly_behavior TYPE REF TO li_fly_behavior, quack_behavior TYPE REF TO li_quack_behavior. ENDCLASS. "lcl_Duck DEFINITION *----------------------------------------------------------------------* * CLASS lcl_fly_with_wings DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_fly_with_wings DEFINITION . PUBLIC SECTION. INTERFACES: li_fly_behavior. ENDCLASS. "lcl_fly_with_wings DEFINITION *----------------------------------------------------------------------* * CLASS lcl_quack DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_quack DEFINITION. PUBLIC SECTION. INTERFACES: li_quack_behavior. ENDCLASS. "lcl_quack DEFINITION *----------------------------------------------------------------------* * CLASS lcl_Squeak DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_squeak DEFINITION. PUBLIC SECTION. INTERFACES: li_quack_behavior. ENDCLASS. "lcl_Squeak DEFINITION *----------------------------------------------------------------------* * CLASS lcl_mute_quack DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_mute_quack DEFINITION. PUBLIC SECTION. INTERFACES: li_quack_behavior. ENDCLASS. "lcl_mute_quack DEFINITION *----------------------------------------------------------------------* * CLASS lcl_mallard_duck DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_mallard_duck DEFINITION INHERITING FROM lcl_duck. PUBLIC SECTION. METHODS: constructor, display REDEFINITION. ENDCLASS. "lcl_mallard_duck DEFINITION *----------------------------------------------------------------------* * CLASS lcl_duck IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_duck IMPLEMENTATION. METHOD performfly. CALL METHOD fly_behavior->fly. ENDMETHOD. "performfly METHOD performquack. CALL METHOD quack_behavior->quack. ENDMETHOD. "performquack ENDCLASS. "lcl_duck IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_fly_with_wings IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_fly_with_wings IMPLEMENTATION. METHOD li_fly_behavior~fly. WRITE: / 'I''m flying'. ENDMETHOD. "li_fly_behavior~fly ENDCLASS. "lcl_fly_with_wings IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_quack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_quack IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / 'quack'. ENDMETHOD. "li_quack_behavior~quack ENDCLASS. "lcl_quack IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_mute_quack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_mute_quack IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / '<<Silence>>'. ENDMETHOD. "li_quack_behavior~quack ENDCLASS. "lcl_mute_quack IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_squeak IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_squeak IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / 'squeak'. ENDMETHOD. "li_quack_behavior~quack ENDCLASS. "lcl_squeak IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_mute_quack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_mallard_duck IMPLEMENTATION. METHOD constructor. CALL METHOD super->constructor. DATA: lrf_quack_behavior TYPE REF TO lcl_quack, lrf_fly_behavior TYPE REF TO lcl_fly_with_wings. CREATE OBJECT: lrf_quack_behavior, lrf_fly_behavior. quack_behavior = lrf_quack_behavior. fly_behavior = lrf_fly_behavior. CLEAR: lrf_quack_behavior, lrf_fly_behavior. ENDMETHOD. "constructor METHOD display . WRITE: / 'I''m a real Mallard duck'. ENDMETHOD. "display ENDCLASS. "lcl_mute_quack IMPLEMENTATIO
运行结果:
注:代码部分来自 http://hi.baidu.com/oabap/item/396ef07827a99a10d0dcb3dd
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,参考Headfirst 设计模式一书,使用abap OO实现