ABAP与设计模式之策略模式
来源:互联网 发布:js颜色代码 编辑:程序博客网 时间:2024/06/05 09:00
本文整合自两篇网文,略做加工,以与前篇保持统一风格.
原文地址: 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. "performquackENDCLASS. "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~flyENDCLASS. "lcl_fly_with_wings IMPLEMENTATION*----------------------------------------------------------------------** CLASS lcl_quack IMPLEMENTATION*----------------------------------------------------------------------***----------------------------------------------------------------------*CLASS lcl_quack IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / 'quack'. ENDMETHOD. "li_quack_behavior~quackENDCLASS. "lcl_quack IMPLEMENTATION*----------------------------------------------------------------------** CLASS lcl_mute_quack IMPLEMENTATION*----------------------------------------------------------------------***----------------------------------------------------------------------*CLASS lcl_mute_quack IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / '<<Silence>>'. ENDMETHOD. "li_quack_behavior~quackENDCLASS. "lcl_mute_quack IMPLEMENTATION*----------------------------------------------------------------------** CLASS lcl_squeak IMPLEMENTATION*----------------------------------------------------------------------***----------------------------------------------------------------------*CLASS lcl_squeak IMPLEMENTATION. METHOD li_quack_behavior~quack. WRITE: / 'squeak'. ENDMETHOD. "li_quack_behavior~quackENDCLASS. "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. "displayENDCLASS. "lcl_mute_quack IMPLEMENTATIO
运行结果:
注:代码部分来自 http://hi.baidu.com/oabap/item/396ef07827a99a10d0dcb3dd
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,参考Headfirst 设计模式一书,使用abap OO实现
- ABAP与设计模式之策略模式
- ABAP与设计模式之观察者模式
- ABAP与设计模式之定义
- ABAP与设计模式之定义
- ABAP与设计模式之工厂方法模式
- ABAP与设计模式之装饰者模式
- 设计模式之简单模式与策略模式
- 设计模式之策略模式与状态模式的区别
- c++ 设计模式之 策略模式与工厂模式结合
- Java设计模式之策略模式与状态模式
- 浅谈设计模式之简单工厂模式与策略模式
- 大话设计模式之工厂模式与策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- [C/C++]结构体大小的计算方法
- 编辑框传值
- XPath的相应规则
- Expert Metalink – Support Tips Tools & Resources
- visitor模式的应用
- ABAP与设计模式之策略模式
- 如何讲代码??
- seo是需要讲技术的
- 学生学籍管理系统
- 交换分区
- matlab难懂的函数
- ad-hoc connecting
- 面对百度绿萝算法再次升级SEO要做什么呢?
- Ubuntu12.04环境下的android源码编译