Android 程序框架设计
1、一些概念
模式的定义:
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。
什么是设计模式?
设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法。
我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验了的。
比 如说,在程序里,可能会有通知模块,A模块的数据发生变化,B模块需要得到通知,对于这样的需要,你可能会想到用"广播","消息"或者"回调"的方式来 解决,的确,刚才我所说的那三种也能解决,但是,这三种都是存在一些缺点,比如说广播,用Intent来传输数据很困难,对于"消息",无法很好的跟踪, 对于"回调",有可能你A与B模块根本不可相互访问。此时,如果你会用观察者模式的问题,这种问题可以很轻松解决。
当然,这里是需要具体问题具体分析的,我主要的意思就是说,要适当利用模式,我们不能为了用模式而去用模式,我们是要用模式来解决我们实际的问题。
概念完整性
关于概念完整性,在《人月神话》一书在有大量的阐述,这里,我把我的理解写出来,与大家分享。
1)概念完整性是系统设计中最重要的考虑因素。当你的系统规模越大,这一点体现得越明显。
2)为了获取概念的完整性,设计必须由一个人或者具有共识的小型团队来完成。这一点很好理解,关于设计,可以让所有的人参与,但是决定权在少数人手里,如果大家都想参与设计,这是根本没有办法保正系统设计是统一完整的。
3)要获得概念上的完整性,就必须有人控制这些概念,类似于贵族的专制统治。这里,对于团队中的项目经理或架构师必须对项目有绝对的权威,不然,这个项目里面的就无法统一号令。
4)概念完整性表现有:
- 开发过程中,需求、设计、编码的一致性 - 整个程序具有统一的风格,比如对话框样式,按钮风格,色调等UI元素 - 整个程序具体统一的结构,比如不同模块访问网络,它们的调用方式一致,例如异步访问都用回调方式通知结果,相同的功能应该提取成共通模块。 - 开发人员能很好的执行需求人员和设计人员的意图。 - 有完整的文档,需求文档,设计文档,测试文档,处理流程的文档等。
如何保持概念完整性
- 在制度上给予保证,产品的负责人必须建立技术上的绝对权威 - 技术负责人员(SE,SL)必须严格执行项目的需求,设计,必须深入到编码细节 - 在不同阶段,保持与所有人员的持续沟通,鼓励开发人员提意见。 - 让开发人员参与设计,但不决定设计 - 通过持续的反馈和沟通来实现模块重用
2、设计之前应该做什么
2.1 共通类的设计
2.1.1 Widget设计
TextView
EditText
Button
Title bar
Tool bar
...
### 为什么要提供这些共通控件? ###
统一字体大小,如App字体不随系统字体变化而变化
统一UI式样,如Button, EditText具有相同的背景等
复用代码
2.1.2 Adapter Items
根据式样,提取需要在AdapterView中显示的Item
简单的复合布局
自绘制,从而提高滑动性能
- ListView中放Gallery时,提高上下滑动性能
- 尽量优化绘制
### 数据驱动 ###
Adapter Items提供核心的方法
- setData(Object data)
- getData();
Adapter#getView实现更加简单
- 实现简单
- 不会因为UI变化而变化
下面代码示例了Adapter#getView()方法的实现,它返回BookView,BookView提供方法来接收数据,至于BookView的显示,则根据设置的数据来显示,这就是数据驱动UI。
1 2 3 4 5 6 7 8 9 10 11 </td> | @Override public View getView(int position, View convertView, ViewGroup parent) { if ( null == convertView) { convertView = new BookView(getContext()); convertView.setLayoutParameter( new AbsListView.LayoutParameter(150, 150)); } Book book = m_bookList.get(position); BookView bookView = (BookView)convertView; bookView.setBook(book); return convertView; } | </tr> </tbody> </table> </div> </div>
1 2 3 4 5 </td> | new TaskManager() .next(task1) .next(task2) .next(task3). .execute(); | </tr> </tbody> </table> </div> </div>
1 2 3 4 5 </td> | new Thread( null , new Runnable() { public void run() { // Do you works. } }, "Thread_name_xxx" ).start(); | </tr> </tbody> </table> </div> </div>