亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3928 | 回復(fù): 0
打印 上一主題 下一主題

turbochen(原作)設(shè)計(jì)模式:實(shí)戰(zhàn)MVC模式 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2002-09-03 15:47 |只看該作者 |倒序?yàn)g覽
[這個(gè)貼子最后由eclipse在 2002/09/03 03:49pm 編輯]

設(shè)計(jì)模式:實(shí)戰(zhàn)MVC模式    turbochen(原作)
  
關(guān)鍵字     design pattern,mvc,observer,java
  


內(nèi)容:
1.MVC
2.Observer接口
3.模型Model
4.視圖View
5.控制器Controller
6.運(yùn)行程序


--------------------------------------------------------------------------------


MVC

“模型-視圖-控制器(Model-View-Controller,MVC)結(jié)構(gòu)是為那些需要為同樣的數(shù)據(jù)提供多個(gè)視圖的應(yīng)用程序而設(shè)計(jì)的,它很好的實(shí)現(xiàn)了數(shù)據(jù)層與表示層的分離。例如下圖中的例子:

我們看到,圖中的幾組數(shù)據(jù)以不同的形式(View)表現(xiàn)出來(lái),一個(gè)是表格樣式,一個(gè)是圖形樣式。

MVC把這種應(yīng)用程序分為三種對(duì)象類型:
模型:維護(hù)數(shù)據(jù)并提供數(shù)據(jù)訪問(wèn)方法。
視圖:給制模型的部分?jǐn)?shù)據(jù)或所有數(shù)據(jù)的可視圖。
控制器:處理事件.
以下是典型的MVC通信方式,


事件由控制器來(lái)處理,控制器接收用戶事件,并根據(jù)事件的類型來(lái)改變模型。
視圖事先會(huì)在模型中登記,當(dāng)模型數(shù)據(jù)發(fā)生改變時(shí),馬上通知已向此模型登記的每個(gè)視圖。
視圖從模取得最新的數(shù)據(jù)并刷新自己.
要實(shí)現(xiàn)MVC,最重要的一個(gè)環(huán)節(jié)是使用Design Pattern中的Observer模式。Observer模式允許某個(gè)對(duì)象在所觀察的對(duì)象發(fā)生修改時(shí)通知多個(gè)觀察者(Observer).

下面我們就以實(shí)例來(lái)講解如何用Obserer模式實(shí)現(xiàn)MVC的程序結(jié)構(gòu)。在我的例子中,我要實(shí)現(xiàn)一個(gè)學(xué)生年齡顯示的例子。分別用清單和圖形的方式顯示每個(gè)學(xué)生的年齡。當(dāng)年齡改變時(shí),自動(dòng)更新顯示。

Observer接口

為了實(shí)現(xiàn)觀察的對(duì)象發(fā)生修改時(shí)通知多個(gè)觀察者,通常要在被觀察者與觀察者之間有一個(gè)小的接口,如下:
/* file: Observer.java */
public interface Observer
{
    public void dataUpdate(Model model)&#59;
}
這個(gè)接口中有一個(gè)dataUpdate(Model model)方法,只要實(shí)現(xiàn)了這個(gè)接口對(duì)象,就成了一個(gè)觀察者。

模型Model

再來(lái)建立一個(gè)數(shù)據(jù)模型。在我的例子中,先建立了一個(gè)數(shù)據(jù)對(duì)象:
/* file: Data.java */
public class Data
{
    public int value&#59;  // 學(xué)生年齡值
    public String name&#59; // 學(xué)生名
}
現(xiàn)在來(lái)建立一個(gè)Model:
/* file: Model.java */
import java.util.*&#59;
public class Model
{
    ArrayList data = new ArrayList()&#59;
    ArrayList observer = new ArrayList()&#59;
    public Model()
    {    super()&#59;
    }
    public Model(int[] value, String[] name)
    {
        for ( int i = 0&#59; i< value.length&#59; i++ )
        {
            addData(value,name)&#59;
        }
    }
    public Model(Data[] data)
    {
        for ( int i = 0&#59; i< data.length&#59; i++ )
        {
            addData(data)&#59;
        }
    }
    public void addData(int value, String name)
    {
        Data data = new Data()&#59;
        data.value = value&#59;
        data.name = name&#59;
        this.data.add(data)&#59;
    }
    public void addData(Data data)
    {
        this.data.add(data)&#59;
    }
    public Data getData(int idx)
    {
        return (Data)(data.get(idx))&#59;
    }

    public int size()
    {
        return data.size()&#59;
    }
  // 用來(lái)向模型中登記觀察者.
    public void registerObserver(Observer o)
    {
        observer.add(o)&#59;
    }
    public void removeObserver(Observer o)
    {
        observer.remove(o)&#59;
    }
    // 當(dāng)數(shù)據(jù)改變時(shí),由Controller調(diào)用此方法,通知各個(gè)Observer,刷新視圖.
    public void changeModel(Model model)
    {
        data.clear()&#59;
        for (int i=0&#59; i<model.size()&#59; i++ )
        {
            this.addData(model.getData(i))&#59;
        }
        dataUpdate()&#59;
    }
    private void dataUpdate()
    {
        for (Iterator i = observer.iterator()&#59; i.hasNext()&#59; )
        {
            Observer o = (Observer)(i.next())&#59;
            o.dataUpdate(this)&#59;
        }
    }
}
這個(gè)模型提供各種數(shù)據(jù)訪問(wèn)的方法。并提供一個(gè)changeModel(Model model)方法供Controller訪問(wèn)。還提供一個(gè)registerObserver(Observer o)方法,用來(lái)向Model中登記觀察者Observer。

視圖View

我們要實(shí)現(xiàn)一個(gè)清單顯示樣式的視圖View1和一個(gè)圖形方式顯示的視圖View2,并讓它們實(shí)現(xiàn)Observer接口,以便當(dāng)Model數(shù)據(jù)改變時(shí),自動(dòng)刷新自己.
/* file: View1.java */
import javax.swing.*&#59;
import java.awt.*&#59;
import javax.swing.border.*&#59;
public class View1 extends JPanel implements Observer
{
    Model model&#59;

    public View1()
    {
    }
    public View1(Model model)
    {
        try
        {
            this.model = model&#59;
            jbInit()&#59;
        }
        catch(Exception e)
        {
            e.printStackTrace()&#59;
        }
    }
    private void jbInit() throws Exception
    {
        this.setBackground(Color.white)&#59;
        this.setBorder(new TitledBorder(BorderFactory.createLineBorder(Color.black,1),&quot;View1&quot)&#59;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g)&#59;
        if ( model == null ) return&#59;
        int x = 20,y = 50&#59;
        int h = g.getFontMetrics().getHeight()&#59;
        for ( int i=0&#59; i< model.size()&#59; i++ )
        {
            Data data = model.getData(i)&#59;
            g.drawString(data.name,x,y)&#59;
            y+=h&#59;
            g.drawString(String.valueOf(data.value),x,y)&#59;
            y+=h&#59;
        }
    }
    // 當(dāng)模型數(shù)據(jù)發(fā)生改變時(shí),會(huì)自動(dòng)調(diào)用此方法來(lái)刷新圖形
    public void dataUpdate(Model model)
    {
        /**@todo: Implement this Observer method*/
        this.model = model&#59;
        repaint()&#59;
    }
}
/* file: View2.java */
import javax.swing.*&#59;
import java.awt.*&#59;
import javax.swing.border.*&#59;
public class View2 extends JPanel implements Observer
{
    Model model&#59;

    public View2()
    {
    }
    public View2(Model model)
    {
        try
        {
            this.model = model&#59;
            jbInit()&#59;
        }
        catch(Exception e)
        {
            e.printStackTrace()&#59;
        }
    }
    private void jbInit() throws Exception
    {
        this.setBackground(Color.white)&#59;
        this.setBorder(new TitledBorder(BorderFactory.createLineBorder(Color.black,1),&quot;View1&quot)&#59;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g)&#59;
        if ( model == null ) return&#59;
        int x = 20,y = 50&#59;
        int h = g.getFontMetrics().getHeight()&#59;
        int width = this.getWidth()&#59;
        int height = this.getHeight()&#59;
        int sy = height / model.size()&#59;
        int sx = width/ 2&#59;
        for ( int i=0&#59; i< model.size()&#59; i++ )
        {
            Data data = model.getData(i)&#59;
            int value = data.value&#59;
            int dx = 3&#59;
            int r = 3&#59;
            Color c = new Color((int)(255*Math.random()),(int)(255*Math.random()),(int)(255*Math.random()))&#59;
            int cx = sx&#59;
            int cy = y+i * sy&#59;
            for ( int j=0&#59;j<value&#59; j++ )
            {
                g.setColor(c)&#59;
                g.drawOval(cx,cy,r,r)&#59;
                r+=dx&#59;
            }
            g.drawString(data.name,25,cy)&#59;
        }
    }
    // 當(dāng)模型數(shù)據(jù)發(fā)生改變時(shí),會(huì)自動(dòng)調(diào)用此方法來(lái)刷新圖形
    public void dataUpdate(Model model)
    {
        /**@todo: Implement this Observer method*/
        this.model = model&#59;
        repaint()&#59;
    }
}

控制器Controller

好了,MVC中的Model,Observer都建立好了,我們最后來(lái)做一個(gè)Controller:
import java.awt.*&#59;
import javax.swing.*&#59;
import javax.swing.border.*&#59;
import java.awt.event.*&#59;
public class Controller extends JFrame
{
    Model model =  new Model()&#59;
    View1 view1 = new View1(model)&#59;
    View2 view2 = new View2(model)&#59;
    JScrollPane jScrollPane1 = new JScrollPane()&#59;
    JButton jButton1 = new JButton()&#59;
    JTextField jTextField1 = new JTextField()&#59;
    JTextField jTextField2 = new JTextField()&#59;
    JLabel jLabel1 = new JLabel()&#59;
    JLabel jLabel2 = new JLabel()&#59;
    JLabel jLabel3 = new JLabel()&#59;
    public Controller()
    {
        try
        {
            jbInit()&#59;
        }
        catch(Exception e)
        {
            e.printStackTrace()&#59;
        }

    }
    private void jbInit() throws Exception
    {
        Data[] data = new Data[2]&#59;
        data[0] = new Data()&#59;
        data[1] = new Data()&#59;
        data[0].name = &quot;Ted&quot;&#59;
        data[0].value = 20&#59;
        data[1].name = &quot;Joy&quot;&#59;
        data[1].value = 14&#59;
        model.addData(data[0])&#59;
        model.addData(data[1])&#59;
        // 注意下面兩行:向模型中登記它的觀察者View1和View2.
        model.registerObserver(view1)&#59;
        model.registerObserver(view2)&#59;

        this.getContentPane().setLayout(null)&#59;
        jScrollPane1.setBounds(new Rectangle(0, 0, 3, 3))&#59;
        jButton1.setBounds(new Rectangle(309, 259, 101, 27))&#59;
        jButton1.setText(&quot;Update&quot&#59;
        jButton1.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                jButton1_actionPerformed(e)&#59;
            }
        })&#59;
        jTextField1.setText(&quot;20&quot&#59;
        jTextField1.setBounds(new Rectangle(80, 254, 52, 30))&#59;
        jTextField2.setText(&quot;14&quot&#59;
        jTextField2.setBounds(new Rectangle(178, 255, 50, 31))&#59;
        jLabel1.setText(&quot;Age:&quot&#59;
        jLabel1.setBounds(new Rectangle(41, 226, 47, 23))&#59;
        jLabel2.setText(&quot;Ted&quot&#59;
        jLabel2.setBounds(new Rectangle(42, 252, 35, 33))&#59;
        jLabel3.setText(&quot;Joy&quot&#59;
        jLabel3.setBounds(new Rectangle(144, 255, 31, 31))&#59;
        view1.setBounds(new Rectangle(7, 5, 225, 20)&#59;
        view2.setBounds(new Rectangle(234, 4, 219, 209))&#59;
        this.getContentPane().add(jScrollPane1, null)&#59;
        this.getContentPane().add(jTextField2, null)&#59;
        this.getContentPane().add(jTextField1, null)&#59;
        this.getContentPane().add(jLabel2, null)&#59;
        this.getContentPane().add(jLabel3, null)&#59;
        this.getContentPane().add(jLabel1, null)&#59;
        this.getContentPane().add(jButton1, null)&#59;
        this.getContentPane().add(view1, null)&#59;
        this.getContentPane().add(view2, null)&#59;
    }
    // 按下Update按鈕,通知Model數(shù)據(jù)發(fā)生改變.
    void jButton1_actionPerformed(ActionEvent e)
    {
        Data[] data = new Data[2]&#59;
        data[0] = new Data()&#59;
        data[1] = new Data()&#59;
        data[0].name = jLabel1.getText()&#59;
        data[0].value = Integer.parseInt(jTextField1.getText())&#59;
        data[1].name = jLabel2.getText()&#59;
        data[1].value = Integer.parseInt(jTextField2.getText())&#59;
        Model m = new Model(data)&#59;
        this.model.changeModel(m)&#59;
    }
    public static void main(String[] args)
    {
        Controller c = new Controller()&#59;
        c.setSize(475,310)&#59;
        c.setVisible(true)&#59;
    }
}

運(yùn)行程序

各位可以將這些代碼各自存為相應(yīng)的源文件,執(zhí)行以下命令編譯
javac Controller.java
運(yùn)行
java Controller.class
就可以看到程序執(zhí)行的效果,



你可以試著改變兩個(gè)學(xué)生的年齡,按一下Update按鈕,相應(yīng)的視圖就更新了。怎么樣,體驗(yàn)到了MVC結(jié)構(gòu)給程序帶來(lái)的方便性了吧?&#59


您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP