个人理解

对于拥有两个变化维度,比如铅笔的颜色和型号,先将其中一个维度抽象为接口并实现,对于另一个维度,设计一个虚拟类,关联第一个接口(作为protected属性),通过改继承虚拟类,实现另一个维度

背景

在ERP市场,存在SAP, Oracle等产品,每个产品包括MM,PP, SD等模块,产品会随时增加,模块也会不断有新的加入。

实例代码

代码符合开闭原则,任何一个维度的新增,仅需增加实现类即可
同时也符合依赖倒置原则,即面向接口编程,每个实现类都有对应接口和虚拟类

"维度1接口
interface if_module.
  methods:get_module returning value(e_module_name) type string.
endinterface.

"维度1实现类1
class mm definition create public.
  public section.
    interfaces:if_module.
endclass.
class mm implementation.
  method if_module~get_module.
    e_module_name = 'MM'.
  endmethod.
endclass.

"维度1实现类2
class pp definition create public.
  public section.
    interfaces:if_module.
endclass.
class pp implementation.
  method if_module~get_module.
    e_module_name = 'PP'.
  endmethod.
endclass.

"维度2抽象类
class erp definition create public abstract.
  public section.
    methods: show_info,
      constructor importing io_module type ref to if_module.

  protected section.
  	**"关联维度1**
    data:mo_module type ref to if_module.
endclass.
class erp implementation.
  method show_info.

  endmethod.
  method constructor.
    mo_module = io_module.
  endmethod.
endclass.

"维度2实现类1
class sap definition inheriting from erp create public.
  public section.
    methods:show_info redefinition.
endclass.
class sap implementation.
  method show_info.
    write: / '系统SAP包含', mo_module->get_module( ), '模块'.
  endmethod.
endclass.

"维度2实现类2
class oracle definition inheriting from erp create public.
  public section.
    methods:show_info redefinition.
endclass.
class oracle implementation.
  method show_info.
    write: / '系统Oracle包含', mo_module->get_module( ), '模块'.
  endmethod.
endclass.

start-of-selection.
  data(lo_erp) = new sap( new pp( ) ).
  lo_erp->show_info( ).

  data(lo_erp2) = new oracle( new mm( ) ).
  lo_erp2->show_info( ).
03-23 18:42