对策:使用面向对象的基本对策,即找到变化的部分,将其封装,留下固定部分。
上述例子的变化部分不言而喻,就是那个取材部分的case语句!事实上,在使用具有面向对象特性的语言进行设计的时候,case语句往往意味着你这里的东西是会带来扩展性、维护性问题的。
改进将是直接的,把取材部分拧出来,然后封装成一个class,我们这个类叫做工厂,你没有看错,工厂的前身就是如此简单和直接。
第一次改进后的效果:
class 餐馆 ; ///类型名字为 餐馆
factory factory_inst; /////假设有一个专门的取材工厂
套餐 function 订餐(string 套餐名);////函数返回值:盒饭,函数名:订餐,函数入参:套餐名
材料 base ; /////定义一个材料句柄,用于hold取材步骤的结果
////step 1:取材
base = factory_inst.create(套餐名);
////step 2:清洗
base.清洗();
////step 3:烹饪
base.烹饪();
////step 4:起锅打包
base.打包();
return base ;///经过上述处理就变成套餐了
endfunction
endclass
class factory ;////新增的取材工厂
材料 function create(套餐名);
材料 base ;
case(套餐名)
“鸡肉”:base = new 鸡肉 ;
“鸭肉” base = new 鸭肉 ;
“牛肉” base = new 牛肉 ;
endcase
return base ;
endfunction
endclass