大隐于市

用艺术的眼光看待编程!

孙东风ID:dongfengsun
131329次访问,排名611好友5人,关注者31
03年从西安交通大学毕业后一直从事移动平台的开发工作。崇尚一切自由的东西,热爱交流。目前专注于手机二维码技术研究并负责技术管理工作,希望能和同行认识、交流、共享。
dongfengsun的文章
原创 73 篇
翻译 2 篇
转载 32 篇
评论 151 篇
孙东风的公告
原创文章转载请注明出处
QQ :372590353
MSN:sundongfeng1227@hotmail.com
  我的EMAIL



最近评论
j7fs:我也正在学习这方面的知识,希望能得到你的指点,
我的邮箱是:j7fs_cn@163.com,望能得到一份源码以便学习之用,谢谢:)
gjprgj:能否列几本书看看?新手,多指教:)
gjprgj:能不能给列几本书看看啊?新手,多指教。
gjprgj:能不能给列几本书看看啊?新手,多指教。
fig_o:就下载了某大师的VC++视频资料
请问在哪里下载。地址给一个
文章分类
收藏
    相册
    存档
    订阅我的博客
    XML聚合  FeedSky

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

    新一篇: 基于Java Socket的文件UpLoad代码 | 旧一篇: 构建基于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如何设计才能把"耦合度"降低到最低?

    发表于 @ 2007年12月03日 21:56:00|评论(loading...)|编辑

    新一篇: 基于Java Socket的文件UpLoad代码 | 旧一篇: 构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(一)

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 孙东风