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、效果