个人理解
对于拥有两个变化维度,比如铅笔的颜色和型号,先将其中一个维度抽象为接口并实现,对于另一个维度,设计一个虚拟类,关联第一个接口(作为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( ).