当前位置: 首页 > news >正文

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(二)

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(二)

Author: 孙东风

Date:03/12/2007

在上一讲中,我们利用MVC+Observer模式设计了移动开发框架。那么,这一节里我们会以一个"媒体播放"为具体实例来实现这个框架。

首先,可以利用UML建模工具进行如下类的设计:

这个类图对应上节我们所讲解的框架设计。

以下是根据这个类图进行的具体coding:

import javax.microedition.lcdui.Graphics;


public class Controls {

boolean isActive = false;

public Controls()
{

}

public void draw(Graphics g)
{

}
}

/**
*
* @author jerry.sun
* @date 2007-11-29 下午12:43:09
*/

public class MediaPlayerControl implements MediaPlayerObserver{

public MediaPlayerView m_view;
public MediaPlayerModel m_model;

public MediaPlayerControl()
{
m_view = new MediaPlayerView();
m_model = new MediaPlayerModel(this);
}

public void SreenUpDate()
{
m_view.CanvasStatusChange();
}
}


/**
*
* @author jerry.sun
* @date 2007-11-29 下午12:40:31
*/

public class MediaPlayerModel implements Runnable{

public MediaPlayerControl m_control;
Queue tempEventsQueue;

public MediaPlayerModel(MediaPlayerControl control)
{
m_control = control;
tempEventsQueue = MediaPlayerView.eventsQueue;
}

public void parseEventsQueue()
{
Object event = tempEventsQueue.get();
int eventID = 0; //event.id;

switch(eventID)
{
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}

m_control.SreenUpDate();
}

public void run() {
// TODO Auto-generated method stub
parseEventsQueue();
}


}

/**
*
* @author jerry.sun
* @date 2007-11-29 下午12:43:34
*/

public interface MediaPlayerObserver {

public void SreenUpDate();
}

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

/**
*
* @author jerry.sun
* @date 2007-11-29 下午12:43:43
*/

public class MediaPlayerView extends Canvas implements Runnable{

static Queue controlsQueue;

static Queue eventsQueue;

public MediaPlayerView()
{
controlsQueue = new Queue();

if(!initControlsQueue())
System.out.println("Maybe the ControlsQueue is full!");
}

public boolean initControlsQueue()
{
return controlsQueue.put(new Controls())
&&controlsQueue.put(new Controls());
//continue...
}

protected void CanvasStatusChange()
{

}

protected void paint(Graphics g) {
// TODO Auto-generated method stub

for(int i = 0;i < controlsQueue.length();i++)
{
Controls tempCon = (Controls)controlsQueue.get();
if(tempCon != null&& tempCon.isActive)
{
tempCon.draw(g);
}else
{
System.out.println("The "+tempCon+" is not activity!");
}
}

}

public void run() {
// TODO Auto-generated method stub

}
}

/**
*
* @author jerry.sun
* @date 2007-11-29 下午12:43:57
*/

public class Queue {
/** 队列的最大长度 */
public static final int MAX_SIZE = 32;
private Object queueArr[] = null;

private int queueHeadId = 0;
private int queueTailId = 0;
private int queueLength = 0;

/** 初始化 */
private void init() {
queueHeadId = 0;
queueTailId = 0;
queueArr = new Object[MAX_SIZE];
for ( int ii = 0; ii < queueArr.length; ii ++) {
queueArr[ii] = null;
}
}

/** 取下一个节点的下标 */
private static int nextID(int id) {
return ( id + 1 ) % MAX_SIZE;
}

/** 取前一个节点的下标 */
private static int preId(int id) {
return ( id + MAX_SIZE - 1) % MAX_SIZE;
}

/** 添加一个 obj 到队列,如果队列满,返回false,正常返回true */
public synchronized boolean put(Object obj) {
if ( isFull() )
return false;
queueArr[queueTailId] = obj;
queueTailId = nextID(queueTailId);
queueLength ++;
return true;
}

/**
* 队列中取出一个 obj,如果队列空,返回 null
* 取出的obj弹出队列
*/
public synchronized Object get() {
if ( isEmpty())
return null;

Object obj = queueArr[queueHeadId];
queueHeadId = nextID(queueHeadId);
queueLength --;
return obj;
}

/**
* 队列中取出一个 obj,如果队列空,返回 null
* 取出的obj不弹出队列
*/
public synchronized Object getWithoutPop()
{
if ( isEmpty())
return null;

Object obj = queueArr[queueHeadId];
return obj;
}

/**
* 当前队列中Obj个数
*/
public int length() {
return queueLength;
}

/**
* 是否队列已经满了
*/
public boolean isFull() {
return queueLength == queueArr.length;
}

/**
* 是否队列是空队列
*/
public boolean isEmpty() {
return queueLength == 0;
}

/** Creates a new instance of Queue */
public Queue() {
init();
}

}

其实在一个软件工程的实施中,前期设计是最占用时间的,一旦程序的框架能清晰的给出来。整个项目也就完成了至少60%,剩余的coding就比较简单了。这也是为什么架构师比程序员值钱的原因!呵呵,说了点题外话,希望能对大家有所启发。

那么这一讲里具体给出了整个程序的框架接口,在剩余的几讲里会具体利用这些框架接口来整合整个项目。还有一些设计的具体细节需要在以后说明,比如前端UI如何设计才能把"耦合度"降低到最低?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 拉结尔6月21日服务器维护,《拉结尔》6月19日换端更新公告
  • 厦门主要IT企业名单(至20071205)
  • 跨机器访问SQL SERVER数据库
  • Matlab_求最大特征值和特征向量
  • 《交通警察》群英传(上)
  • Matlab_求向量的前K个最大值及对应的位置
  • 年初17大热门技术 年底走势如何
  • MATLAB函数:rand、randn、bar、hist、ksdensity、norm、diff函数
  • MATLAB函数:min、randn、norm、logspace函数
  • 9大热门技术的安全隐患
  • matlab 警告:警告: 更新 Legend 时出错。Not enough input arguments.
  • 在虚拟世界中部署 Windows
  • 应用宝苹果版_U电共享充电宝苹果版下载-U电共享充电宝APP
  • 增大iphone音量技巧_手机声音太小?只要按下这个键,音量立马大许多,不怕听不清...
  • 关于partnerLinkType的相关实验
  • Git 使用集
  • k8s 面向应用开发者的基础命令
  • Laravel 菜鸟晋级之路
  • Linux gpio口使用方法
  • PHP变量
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 简单易用的leetcode开发测试工具(npm)
  • 区块链共识机制优缺点对比都是什么
  • 如何优雅地使用 Sublime Text
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 收藏好这篇,别再只说“数据劫持”了
  • 消息队列系列二(IOT中消息队列的应用)
  • 追踪解析 FutureTask 源码
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • # C++之functional库用法整理
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • %check_box% in rails :coditions={:has_many , :through}
  • (C#)一个最简单的链表类
  • (Java入门)学生管理系统
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (不用互三)AI绘画工具应该如何选择
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (回溯) LeetCode 78. 子集
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)http协议
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .gitattributes 文件
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Remoting学习笔记(三)信道
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET连接数据库方式
  • .Net语言中的StringBuilder:入门到精通
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @antv/g6 业务场景:流程图
  • @Validated和@Valid校验参数区别
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)