您的位置:首页 > 编程语言 > Java开发

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

2008-01-03 10:19 615 查看
构建基于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如何设计才能把"耦合度"降低到最低?

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1914508
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐