MVC设计模式--HeadFirst学习

1、模型视图设计器模式

是可重用性很高的基于多个模式创建出来的复合模式,其中模型负责数据状态和逻辑、视图负责显示和交互、控制器负责传达视图要求模型需要执行的命令,而模型和视图之间是观察者模式关系、视图和控制器之间是策略模式关系,视图本身通过组合模式实现。

2、例子代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MVCPattern
{
    /// <summary>
    /// 模型
    /// </summary>
    public interface BeatModelInterface
    {
        void initialize();

        void on();

        void off();

        void setBMP(int bmp);

        int getBMP();

        void registerBeatObserver(BeatObserver observer);

        void registerBMPObserver(BMPObserver observer);

    }

    public class BeatModel : BeatModelInterface
    {
        private List<BeatObserver> m_BeatObservers;
        private List<BMPObserver> m_BMPObservers;
        private int m_bmp;
        private bool m_IsOn;

        public BeatModel()
        {
            m_BeatObservers = new List<BeatObserver>();
            m_BMPObservers = new List<BMPObserver>();
            initialize();
        }

        #region BeatModelInterface 成员

        public void initialize()
        {
            m_bmp = 90;
            m_IsOn = false;
            Console.WriteLine("DJ正在初始化....");
        }

        public void on()
        {
            m_IsOn = true;
            foreach (var observer in m_BeatObservers)
            {
                observer.setStartEnable(false);
                observer.setStopEnable(true);
            }
        }

        public void off()
        {
            m_IsOn = false;
            foreach (var observer in m_BeatObservers)
            {
                observer.setStartEnable(true);
                observer.setStopEnable(false);
            }
        }

        public void setBMP(int bmp)
        {
            m_bmp = bmp;
            foreach (var observer in m_BMPObservers)
            {
                observer.setBMPValue(bmp);
            }
        }

        public int getBMP()
        {
            return m_bmp;
        }

        public void registerBeatObserver(BeatObserver observer)
        {
            m_BeatObservers.Add(observer);
        }

        public void registerBMPObserver(BMPObserver observer)
        {
            m_BMPObservers.Add(observer);
        }


        #endregion
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MVCPattern
{
    /// <summary>
    /// 控制器
    /// </summary>
    public interface ControllerInterface
    {
        void start();

        void stop();

        void increaseBMP();

        void decreaseBMP();

        void setBMP(int bmp);
    }

    public class BeatController : ControllerInterface
    {
        private BeatModelInterface m_model;
        public BeatController(BeatModelInterface model)
        {
            m_model = model;
        }

        #region ControllerInterface 成员

        public void start()
        {
            m_model.on();
        }

        public void stop()
        {
            m_model.off();
        }

        public void increaseBMP()
        {
            m_model.setBMP(m_model.getBMP()+5);
        }

        public void decreaseBMP()
        {
            m_model.setBMP(m_model.getBMP() - 5);
        }

        public void setBMP(int bmp)
        {
            m_model.setBMP(bmp);
        }

        #endregion
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraBars;

namespace MVCPattern
{
    /// <summary>
    /// 视图
    /// </summary>
    public interface BeatObserver
    {
        void setStartEnable(bool enable);

        void setStopEnable(bool enable);
    }

    public interface BMPObserver
    {
        void setBMPValue(int bmp);
    }

    public partial class View : Form, BeatObserver, BMPObserver
    {
        private BeatModelInterface m_model;
        private ControllerInterface m_controller;

        public View(BeatModelInterface model,ControllerInterface controller)
        {
            InitializeComponent();
            m_model = model;
            m_controller = controller;
            m_model.registerBeatObserver(this);
            m_model.registerBMPObserver(this);

            startMenuItem.ItemClick += on_startMenuItemClick;
            stopMenuItem.ItemClick += on_stopMenuItemClick;
            setBMP.ItemClick += on_setBMPItemClick;
            minusControl.ItemClick += on_MinusControlClick;
            PlusControl.ItemClick += on_PlusControlClick;
            
            stopMenuItem.Enabled = false;
        }

        private void on_startMenuItemClick(object sender, ItemClickEventArgs e)
        {
            m_controller.start();
        }

        private void on_stopMenuItemClick(object sender, ItemClickEventArgs e)
        {
            m_controller.stop();
        }

        private void on_setBMPItemClick(object sender, ItemClickEventArgs e)
        {
            m_controller.setBMP(int.Parse(BMPEdit.EditValue.ToString()));
        }

        private void on_MinusControlClick(object sender, ItemClickEventArgs e)
        {
            m_controller.decreaseBMP();
        }
        private void on_PlusControlClick(object sender, ItemClickEventArgs e)
        {
            m_controller.increaseBMP();
        }
        

        #region BeatObserver 成员

        public void setStartEnable(bool enable)
        {
            startMenuItem.Enabled = enable;
        }

        public void setStopEnable(bool enable)
        {
            stopMenuItem.Enabled = enable;
        }

        #endregion

        #region BMPObserver 成员

        public void setBMPValue(int bmp)
        {
            string defaultCap = "Current BMP:";
            bpmOutputLabel.Caption = defaultCap + bmp.ToString();
            beatBar.EditValue = bmp;
            BMPEdit.EditValue = bmp;
        }

        #endregion
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace MVCPattern
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            BeatModelInterface pModel = new BeatModel();
            ControllerInterface pController = new BeatController(pModel);
            Application.Run(new View(pModel, pController));
        }
    }
}


3、效果

              

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值