今天因为工作室组长去面试了CVTE,然后被问了设计微波炉功能。现在想向大家展示自己的思路。
题目要求
设计微波炉功能,带皮不能加热,加热时不能打开,要求可扩展性。
分析问题
寻找具有状态的本身实体对象,这里就有两种:1、微波炉。2、食物。所以就将微波炉和食物设计成一个接口,里面的方法都是该对象所具备的状态。
寻找状态
微波炉有打开、加热、加热是否打开、关闭4中状态。而问题主要针对是是否在加热状态。所以应该实现这两种具体类。而食物只有带皮、不带皮两种状态。问题针对也是是否有果皮。
寻找决定性因素
在微波炉和食物之中,哪个决定哪个的使用。问题假设:假如你没有食物,你还需要用到微波炉吗?假如你没有微波炉,你的食物能吃吗?从假设之中我们可以看出来,决定性因素是食物,所以在控制微波炉功能块(MicrowaveController)应该实现决定性因素(FoodState)的状态接口。
有关微波炉的代码
创建微波炉接口实现4种状态
|
创建属于普通状态下的微波炉
|
创建属于加热状态下的微波炉
|
有关食物的代码
食物状态接口
|
操控微波炉的说明书
|
实现了食物状态接口(FoodState),可以解决问题中带皮问题。然后再通过实例化两个不同的状态(Openmicrowave类和Heatmicrowave类)下的微波炉,在对应接口方法中填入对应状态的功能,解决了加热不能打开的问题。setMyController就是用来识别食物状态对应的状态的微波炉。很好的利用接口的特性把具体对象封装起来。然后用户只需要通过MicrowaveController这个工具类对食物进行操作就可以了,完全不用知道不同状态下微波炉会具体做些什么事情。从而达到对用户的透明性。
可扩展性
具体状态的微波炉(Openmicrowave类和Heatmicrowave类)中具体方法可以实现各种不同的操作,通过接口解耦从而使扩展性高。
调用代码:
|
效果图
带皮食物加热效果图
不带皮食物加热效果图