zoukankan      html  css  js  c++  java
  • ABAP与设计模式之装饰者模式

    引用:翱翔云天

    首先,按照惯例,上例子程序的类图

    测试程序如下:

    REPORT ZBOBO_DP_003_RE .

    *The class and interface for this program

    include zbobo_dp_003_if_cl.

    *Reference data for drink definition

    data: dr_ref type ref to drink.

    *Temp reference for decorator

    data:tdr type ref to drink.

    start-of-selection.

    *-------------------start decorate---------------*

    * Narrowing cast

    * Create darkroast object

    create object tdr type darkroast.

    * Make dr_ref point to the object darkroast

    * And this is the need to be decorated material

    dr_ref = tdr.

    * Use mocha to decorate object darkroast

    create object tdr type mocha

    exporting dr = dr_ref. "This dr_ref is darkroast

    dr_ref = tdr.

    * Use soy to decorate object mocha&darkroast

    create object tdr type soy

    exporting dr = dr_ref. "This dr_ref is mocha

    dr_ref = tdr.

    * Use whip to decorate object soy&mocha&darkroast

    create object tdr type whip

    exporting dr = dr_ref. "This dr_ref is soy

    dr_ref = tdr.

    *-------------------end decorate---------------*

    * Define data which used to display data

    data: ls type string,lf type f.

    * Get description

    ls = dr_ref->getdesc( ).

    * Get cost

    lf = dr_ref->cost( ).

    * Display result

    write: / ls, ':$',lf decimals 2 exponent 0.

    定义component,在我们的例子中是超类drink,注意它是一个抽象类

    *----------------------------------------------------------------------*

    * INCLUDE ZBOBO_DP_003_IF_CL *

    *----------------------------------------------------------------------*

    *For the Decorator pattern, normally using an abstract super class

    *And the Decorator class inherite from the super class also as an

    * abstract class

    *Super abstract class with drink

    class drink definition abstract.

    public section.

    data: desc type string.

    methods:

    * Get the drink's description

    getdesc returning value(de) type string,

    * Because the cost must be calculate from every concrete material

    * It should be an abstract method

    cost abstract returning value(co) type f.

    endclass.

    *Implement the drink class

    class drink implementation.

    method getdesc.

    * Return the description

    de = desc.

    endmethod.

    endclass.

    定义concrete component,在我们的例子中,它是饮料类的一个子类darkroast

    *An concrete class for drink, as one need to be decorated

    class darkroast definition inheriting from drink.

    public section.

    methods:

    * initialization

    constructor,

    * The subclass should implement abstract method from super

    cost redefinition.

    endclass.

    *Implement darkroast

    class darkroast implementation.

    method constructor.

    call method super->constructor.

    * Give a new description

    desc = 'Darkroast'.

    endmethod.

    method cost.

    * Get the raw material cost

    co = '1.99'.

    endmethod.

    endclass.

    定义装饰者抽象类,注意,他只不过继承了drink类,并没有作什么,我们需要的只不过是一个接口,一个装饰者和被装饰者的交互接口。

    *Decorator definition, which will decorate the raw material

    *The decorator should be as abstract class

    *It is just for supply an interface, it won't implement

    *any method of super class

    *Or you could define new method here so that the subclass

    *of decorator should have new method in it

    class decorator definition abstract

    inheriting from drink.

    endclass.

    class decorator implementation.

    endclass.

    定义具体的装饰者

    *Define the concrete decorator which will used to decorate

    * the concrete drink object, for exp: darkroast

    class mocha definition inheriting from decorator.

    public section.

    * Define the interface which will point to super class drink

    data:

    drink type ref to drink.

    methods:

    * Ininitialization

    constructor

    importing dr type ref to drink,

    * Redifine the getdesc method so that we can get the right name

    * of the decorated drink

    getdesc redefinition,

    * Redifine the cost method so that we can get the right price

    * of the decorated drink

    cost redefinition.

    endclass.

    class mocha implementation.

    method constructor.

    call method super->constructor.

    * Make drink instance variant point to decorator

    * For example, if darkroast decorated with mocha

    * the reference drink shoul be pointed to darkroast

    drink = dr.

    endmethod.

    method getdesc.

    * This method will show how many decorate material we used

    data: ls_mocha type string.

    ls_mocha = drink->getdesc( ).

    concatenate ls_mocha ',Mocha' into de.

    endmethod.

    method cost.

    * Calculate the total price of the new drink which be decorated

    * by the decorator

    data: lf_mocha type f.

    lf_mocha = drink->cost( ).

    co = lf_mocha + '0.20'.

    endmethod.

    endclass.

    定义其他的装饰者,和上面的差不多

    *The below part is mostly the same as mocha, because all of them

    *are decorators for the drink raw material

    class soy definition inheriting from decorator.

    public section.

    data:

    drink type ref to drink.

    methods:

    constructor

    importing dr type ref to drink,

    getdesc redefinition,

    cost redefinition.

    endclass.

    class soy implementation.

    method constructor.

    call method super->constructor.

    drink = dr.

    endmethod.

    method getdesc.

    data: lssoy type string.

    lssoy = drink->getdesc( ).

    concatenate lssoy ',Soy' into de.

    endmethod.

    method cost.

    data: lfsoy type f.

    lfsoy = drink->cost( ).

    co = lfsoy + '0.40'.

    endmethod.

    endclass.

    class whip definition inheriting from decorator.

    public section.

    data:

    drink type ref to drink.

    methods:

    constructor

    importing dr type ref to drink,

    getdesc redefinition,

    cost redefinition.

    endclass.

    class whip implementation.

    method constructor.

    call method super->constructor.

    drink = dr.

    endmethod.

    method getdesc.

    data: lswhip type string.

    lswhip = drink->getdesc( ).

    concatenate lswhip ',Whip' into de.

    endmethod.

    method cost.

    data: lfwhip type f.

    lfwhip = drink->cost( ).

    co = lfwhip + '0.60'.

    endmethod.

    endclass.

    这个程序比较难理解,有点像我们平时写的递归,下面我把getdesc方法的顺序画出来就比较容易理解了,说明如下:

    显示的图片不是很清楚地话,你可以用右键--〉图片另存为到本地就可以看清楚了。

  • 相关阅读:
    css(上)
    前端基础
    并发编程,python的进程,与线程
    网络编程 套接字socket TCP UDP
    python 类的内置函数2
    python3大特征之多态
    python 类(object)的内置函数
    类 与 继承
    类 与 面向对象
    OOP >>> 封装
  • 原文地址:https://www.cnblogs.com/wequst/p/1513353.html
Copyright © 2011-2022 走看看