二维码

[面向对象] ABAP面向对象设计模式--MVC(Model View Controller)

Twilight发表于 2018-01-17 16:551572873912@qq.c 最后回复于 2018-04-13 08:50 [复制链接] 7125 3

MVC是一种软件设计模式,已经被Java、PHP等语言大量使用。MVC设计模式含义:Model模型,指取数处理逻辑;View视图,指数据输出;Controller控制器,用来将Model和View连接起来。其优势明显:将View前端设计和Model后端逻辑处理设计分开,在团队开发时,可以同时开发提高效率,其次 Model提高了代码复用率。
在大而复杂的应用程序开发可以采用这种模式,小应用就浪费时间了。

举例说明:数据库取出数据,通过ALV、SmartForm、Fiori输出,这里取数处理的逻辑都是一样的,可以共用一个Model,三个View,然后用Controller将他们连接控制起来。
1、Model类
GET_DATA方法Importing参数IR_ERDAT TYPE TPMY_R_DATE
MVC1.jpg
  1.   METHOD get_data.

  2.     SELECT *
  3.     FROM vbak
  4.     INTO  TABLE t_vbak
  5.     WHERE erdat IN ir_erdat.

  6.   ENDMETHOD.
复制代码

MVC2.jpg

2、Controller类
GET_OBJECT方法Importing参数IF_NAME TYPE CHAR30
MVC3.jpg
  1.   METHOD get_object.

  2.     DATA: lo_object TYPE REF TO object.

  3.     CREATE OBJECT lo_object TYPE (if_name).
  4.     IF sy-subrc = 0.
  5. *   Downcasting to assign generic object to O_MODEL
  6.       o_model ?= lo_object.
  7.     ENDIF.

  8.   ENDMETHOD.
复制代码

MVC4.jpg

3、ALV输出调用代码:
  1. REPORT y001.

  2. START-OF-SELECTION.
  3. *--------------------------------------------------------------------*
  4. * Controller
  5. *--------------------------------------------------------------------*
  6.   DATA: lo_control TYPE REF TO zcl_control.

  7. * Iniiate controller
  8.   CREATE OBJECT lo_control.

  9. * Get the object from Control
  10.   CALL METHOD lo_control->get_object
  11.     EXPORTING
  12.       if_name = 'ZCL_MODEL'.

  13. *--------------------------------------------------------------------*
  14. * Model - Business Logic
  15. *--------------------------------------------------------------------*
  16. * Date Range
  17.   DATA: r_erdat  TYPE RANGE OF vbak-erdat,
  18.         la_erdat LIKE LINE OF r_erdat.

  19.   la_erdat-sign = 'I'.
  20.   la_erdat-option = 'BT'.
  21.   la_erdat-low = sy-datum - 10.
  22.   la_erdat-high = sy-datum.
  23.   APPEND la_erdat TO r_erdat.

  24. * Get data method
  25.   CALL METHOD lo_control->o_model->get_data
  26.     EXPORTING
  27.       ir_erdat = r_erdat.
  28. *
  29. *--------------------------------------------------------------------*
  30. * View - ALV output
  31. *--------------------------------------------------------------------*
  32.   DATA: lo_alv TYPE REF TO cl_salv_table.

  33.   DATA: lx_msg TYPE REF TO cx_salv_msg.
  34.   TRY.
  35.       cl_salv_table=>factory(
  36.         IMPORTING
  37.           r_salv_table = lo_alv
  38.         CHANGING
  39.           t_table      = lo_control->o_model->t_vbak ).
  40.     CATCH cx_salv_msg INTO lx_msg.
  41.   ENDTRY.

  42. * Displaying the ALV
  43.   lo_alv->display( ).
复制代码
4、SmartForm输出调用代码:
  1. REPORT y002.

  2. START-OF-SELECTION.
  3. *--------------------------------------------------------------------*
  4. * Controller
  5. *--------------------------------------------------------------------*
  6.   DATA: lo_control TYPE REF TO zcl_control.

  7. * Iniiate controller
  8.   CREATE OBJECT lo_control.
  9. *
  10. * Get the object from Control
  11.   CALL METHOD lo_control->get_object
  12.     EXPORTING
  13.       if_name = 'ZCL_MODEL'.

  14. *--------------------------------------------------------------------*
  15. * Model - Business Logic
  16. *--------------------------------------------------------------------*
  17. * Date Range
  18.   DATA: r_erdat  TYPE RANGE OF vbak-erdat,
  19.         la_erdat LIKE LINE OF r_erdat.

  20.   la_erdat-sign = 'I'.
  21.   la_erdat-option = 'BT'.
  22.   la_erdat-low = sy-datum - 10.
  23.   la_erdat-high = sy-datum.
  24.   APPEND la_erdat TO r_erdat.

  25. * Get data method
  26.   CALL METHOD lo_control->o_model->get_data
  27.     EXPORTING
  28.       ir_erdat = r_erdat.
  29. *
  30. *--------------------------------------------------------------------*
  31. * View - Smartform Output
  32. *--------------------------------------------------------------------*
  33. * Smartform FM
  34.   DATA: l_form TYPE tdsfname VALUE 'ZTEST_MVC',
  35.         l_fm   TYPE rs38l_fnam.

  36.   CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
  37.     EXPORTING
  38.       formname           = l_form
  39.     IMPORTING
  40.       fm_name            = l_fm
  41.     EXCEPTIONS
  42.       no_form            = 1
  43.       no_function_module = 2
  44.       OTHERS             = 3.

  45. * calling Smartform FM
  46.   DATA: ls_control  TYPE ssfctrlop.  " Controlling info
  47.   DATA: ls_composer TYPE ssfcompop.  " Output info
  48. *
  49.   CALL FUNCTION l_fm
  50.     EXPORTING
  51.       control_parameters = ls_control
  52.       output_options     = ls_composer
  53.       user_settings      = ' '
  54.       t_vbak             = lo_control->o_model->t_vbak
  55.     EXCEPTIONS
  56.       formatting_error   = 1
  57.       internal_error     = 2
  58.       send_error         = 3
  59.       user_canceled      = 4
  60.       OTHERS             = 5.
  61.   IF sy-subrc <> 0.
  62.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  63.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  64.   ENDIF.
复制代码

回复

使用道具 举报

Kd330
感觉用mvc最好的就是Asp.Net MVC了,因为我只用过这个。
回复 支持 反对

使用道具 举报

Twilight
Kd330 发表于 2018-1-18 11:27
感觉用mvc最好的就是Asp.Net MVC了,因为我只用过这个。

你说的是MVC框架吧,这里是设计模式
回复 支持 反对

使用道具 举报

1572873912@qq.c
楼主用过Fiori?用Fiori 做地图导航,是否可以?MVC架构
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表