探讨页面按键管理的各种方式
class org.ideamarker.as2.keyhandle.example.cor.LiveMiniEpgUI implements IKeyControlItem {private var m_keyControlManager:KeyControlManager;// keyCode组的集合private var m_keyCodeGroup:Array;// 当前key组的indexprivate var m_nowGroupIndex:Number;public function LiveMiniEpgUI() {}/** * 注册本页面 */private function regKeyItem():Void {m_keyControlManager.regItem(this);}/** * 注册本页面感兴趣的键值 */private function regKeyCodeGroup():Void {// 注册键值m_keyCodeGroup.push([Const.UP, Const.DOWN, Const.OK]);// 当此例子改成观察者模式的时候放开注释// m_keyCodeGroup.push([Const.UP, Const.DOWN]);m_nowGroupIndex = 0;}public function setKeyControlManager(_keyControlManager:KeyControlManager):Void {m_keyControlManager = _keyControlManager;regKeyItem();regKeyCodeGroup();}public function show(_chanInfo:String):Void {}public function keyHandle(_keyCode:String):Void {switch(_keyCode) {case (Const.UP):this.onUp();break;case (Const.DOWN):this.onDown();break;case (Const.OK):this.onOk();break;}}public function getInterestingKeys():Array {return m_keyCodeGroup[m_nowGroupIndex];}private function onUp():Void {// do sth.}private function onDown():Void {// do sth.}private function onOk():Void {// 隐藏miniepgm_keyControlManager.unRegItem(this);}}?
优点:
抽象出了一个工具类,方便使用,易于理解;
缺点:
无法实现“按键责任分配总结”中的第2种情况;
?
//====观察者模式按键管理方式的代码演示
因为多了一个return,上个例子就是责任链模式;
如果将这个return去掉,上个例子就可以变成观察者模式;但是,需要做点修改:
1)需要添加更多的可能情况的key组;
2)m_nowGroupIndex需要随着页面的跳转而改变;
?
疑惑:
1、总是觉得现在这样的状态模式还是不够抽象,能够抽象出像责任链模式例子中的KeyControlManager类就更加好了;
2、总是觉得这个责任链模式例子中的代码,不是那么和谐,尤其是keyHandle()方法中的内容(虽然可以使用map来关联keyCode和Function);
有没有更加好的改进方法?
?
?
?
声明:
1、本文属于原创文章,历时一周思考得出的结论;
2、由于工作原因,本文代码由Actionscript2实现,语法和Java很类似,请不要对语言的优劣性有任何微词;
?