ポイント
------------------------------------------------- -
MVCは、オブザーバーパターン、戦略パターンと組み合わせたモードとの複合モデルです。
視聴者を更新するようにデカップリングを保ちながら、モード、オブザーバーパターンを使用。
コントローラは、ビューは、異なるコントローラを使用して異なる動作を取得することができ、ポリシー図です。
表示モードは、ユーザインタフェースの組合せを用いて実装、ユーザーインターフェースは、典型的には、パネル、フレーム及びボタン等のネストされたコンポーネントの組み合わせです。
これらのパターンは、一緒に3つのMVCモードのデカップリングを働くので、彼らは、クリーンなデザインと弾力を保つことができます。
新しいモデルのためのアダプタモードは、既存のビューとコントローラに適応しました。
Web上のモデル2 MVCアプリケーション。
モデル2において、コントローラは、サーブレットとして実装され、JSP / HTMLの実装ビュー
MVCパターン
------------------------------------------------ ---
上記説明MVC約以下に、この図によれば、画像MVCモデルに記載されています。
1、あなたはユーザーです - あなたは表示と対話します
ビューは、モデルウィンドウです。あなたは(例:ボタンを「再生」を押してください)ビュー上のすべて何かをするときは、ビューコントローラは、何をすべきかを教えてくれます。コントローラはの世話をします。
図2に示すように、コントローラは、必要なモデルの状態を変化させます。
あなたのモーションコントローラをお読みください。あなたがボタンを押すと、コントローラは、このアクションの重要性を理解し、対応するアクションを作成する方法のモデルを通知します。
前記コントローラは、変更を行うためにビューを必要とするかもしれません。
コントローラは、ビューからの操作を受信すると、構造はまた、結果のビューを変更するには、それを伝える必要があるかもしれません。例えば、コントローラは、インターフェース上のいくつかのボタンまたはメニュー項目が有効か無効になってもよいです。
4.モデルが変化し、モデルビューを通知します。
あなたは(ボタンを押すことにより)特定のアクションを行うか、いくつかの内部の変化(たとえば、次の曲のプレイリストの先頭を)持っているかどうかなどの長いモデルの変更内部のすべてのように、モデルは、そのビューステートを通知します変更。
モデルビューのステータスの問い合わせ。
これは、モデルから直接ステータスを取得するための図を示しています。新しい曲の再生開始時に例えば、モデルは、ビューへの曲のタイトルは、モデルを要求し、表示されたビューを通知します。コントローラ要求はビューを変更する場合は、ビューにもモデルのいくつかを述べることを求められることがあります。
MVCのパターンを確認するために色ガラスを身に着けています
パターンは、それを構成したことにより、MVCパターンの使用は何をしますか?
使用します。
1. Strategyパターン
コントローラは、ポリシービューモードを実現する:異なる戦略を使用して調整することができるオブジェクトの図であり、制御戦略が提供されます。見るだけで、任意の行動とのインタフェースに、システムの可視部分を気には、コントローラの処理に委託されています。相互作用モデルを担当すると、コントローラは、ユーザの要求を渡すために使用戦略モードも、ビューとモデルのデカップリングとの間の関係を可能にします。そして、どのように行うの仕事には、ハウの知識を表示します。
2. Observerパターン
モデルは、状態変化は、関連オブジェクトが継続的に更新されますオブザーバーパターンを実装します。あなたは完全に独立したモデルビューとコントローラを作ることができ、Observerパターンを使用してください。同じモデルは、あなたも、同時に複数のビューを使用することができ、異なるビューを使用することができます。
3.コンビネーションモード
ウィンドウパネル、ボタン、テキストラベルを表示します。コンポーネントは、各表示ノード(例えば、ウィンドウ)の組合せではない場合、それはリーフノード(例えば、ボタン)です。コントローラは、ビューの更新を指示したとき、ちょうど残りを処理するものの組み合わせとすることができるトップレベルのアセンブリのビューを教えてください。
上記の説明の様々なモードを使用してMVCについては、例えば次のように見ると、このブログをご紹介します。
ビートを制御するMVCを使用してください
BeatModelInterface.java
組み合わせたパッケージ;
パブリックインターフェイスBeatModelInterface {
(初期化を無効); // BeatModel初期化された後、このメソッドが呼び出される
()上のボイド; //オープンメトロノームの
無効オフ(); //閉じるメトロノームの
ボイドsetBPM(int型BPM ); //セットは、BMP値
INTのgetBPMを(); //現在の値BMP得る
空隙RegisterObserver(BeatObserver O)を、
ボイドremoveObserver(BeatObserver O);
ボイドRegisterObserver(BPMObserver O);
ボイドremoveObserver(BPMObserver O);
}
モデル
BeatModel.java
組み合わせたパッケージ;
java.util.ArrayListののインポート、
インポートjavax.sound.midi.MetaEventListener;
インポートjavax.sound.midi.MetaMessage;
インポートjavax.sound.midi.MidiEvent;
インポートjavax.sound.midi.MidiSystem;
インポートjavax.sound .midi.Sequence;
インポートjavax.sound.midi.Sequencer;
インポートjavax.sound.midi.ShortMessageの、
インポートjavax.sound.midi.Track;
publicクラスBeatModel実装BeatModelInterface、MetaEventListener {
シーケンサシーケンサ; //シーケンサー(シーケンサー)オブジェクトが真のビートを生成する方法を知っている
のArrayList beatObservers =新しいArrayListを(); // 観察者の2種類を(1観察)は観察された変化のBPMを打つ
; ArrayListを=新しい新bpmObserversのArrayList()
int型= 90 BPM;
シーケンス配列;
トラックを追跡。
公共ボイド初期化(){
setUpMidi();
buildTrackAndStart();
}
()ON公共ボイド{
sequencer.start();
setBPM(90);
}
公共ボイドOFF(){
setBPM(0);
sequencer.stop()。
}
公共ボイドsetBPM(int型BPM){
this.bpm = BPM; //インスタンス変数BPMセット
sequencer.setTempoInBPMを(getBPMは()); //変更請求シーケンサBPMの
notifyBPMObservers(); //すべてのオブザーバのBPMを通知します、BPMが変更されている
}
)公共のint getBPMを({
BPMを返す;
}
ボイドbeatEvent(){
notifyBeatObservers();
}
公共ボイドRegisterObserver(BeatObserver O){
beatObservers.add(O);
}
公共ボイドnotifyBeatObservers(){
以下のために(INT i = 0; iはbeatObservers.size()<; iは++)を{
BeatObserverオブザーバ=(BeatObserver)beatObservers.get(I)。
observer.updateBeat();
}
}
公共ボイドregisterObserver(BPMObserver 0){
bpmObservers.add(O)
}
公共ボイドnotifyBPMObservers(){
ため(INT i = 0; iは++; iはbpmObservers.size()<){
BPMObserverオブザーバ=(BPMObserver)bpmObservers.get(i)を、
observer.updateBPM();
}
}
公共ボイドremoveObserver(BeatObserver 0){
int型I = beatObservers.indexOf(O)
IF(I> = 0){
beatObservers.remove(I)。
}
}
公共ボイドremoveObserver(BPMObserver 0)を{
I = bpmObservers.indexOf(O)がINT。
IF(I> = 0){
bpmObservers.remove(I)。
}
}
公共ボイドメタ(MetaMessageメッセージ){
IF(message.getType()== 47){
beatEvent()。
sequencer.start();
setBPM(getBPM())。
}
}
公共ボイドsetUpMidi(){
試み{
シーケンサ= MidiSystem.getSequencer()。
sequencer.open();
sequencer.addMetaEventListener(この);
配列=新しいシーケンス(Sequence.PPQ、4)。
トラック= sequence.createTrack()。
sequencer.setTempoInBPM(getBPM())。
}キャッチ(例外e){
e.printStackTrace();
}
}
公共ボイドbuildTrackAndStart(){
INT []トラックリスト= {35、0、46、0}。
sequence.deleteTrack(NULL)。
トラック= sequence.createTrack()。
makeTracks(トラックリスト)。
track.add(makeEvent(192,9,1,0,4))。
{試みる
sequencer.setSequence(配列)。
}キャッチ(例外e){
e.printStackTrace();
}
}
公共ボイドmakeTracks(INT []リスト){
ため(; iはlist.length <; I = 0 int型私は++){
int型キー=リストを[I]。
IF(キー!= 0){
track.add(makeEvent(144,9、キー、100、I))。
track.add(makeEvent(128,9、キー、100、I + 1))。
}
}
}
公共のMidiEvent makeEvent(INT COMD、INTちゃん、INT 1、INT 2、INTティック){
のMidiEventイベント= NULL;
{試みる
ShortMessageにAが=新規のShortMessage()。
a.setMessage(COMD、ちゃん、一つ、二つ)。
イベント=新しいのMidiEvent(ダニ)。
}キャッチ(例外e){
e.printStackTrace();
}
イベントを返します。
}
}
オブザーバー
BeatObserver.java
パッケージを組み合わせ;
パブリックインターフェースBeatObserver {
ボイドupdateBeat();
}
BPMObserver.javaの
組み合わせパッケージ。
パブリックインターフェースBPMObserver {
ボイドupdateBPM();
}
ビュー
BeatBar.java
パッケージを組み合わせ;
輸入javax.swing.JProgressBar。
パブリッククラスBeatBarはJProgressBarのが実行可能{実装延び
JProgressBarのプログレスバー。
スレッドthread;
パブリックBeatBar(){
スレッド=新しいスレッド(この)。
setMaximum(100)。
thread.start();
}
@Override
公共ボイドラン(){
(;;){ため
int値=のgetValue()。
値=(int型)(値* 0.75);
setValue(値)。
再描画();
{試みる
のThread.sleep(50)。
}キャッチ(例外e){
e.printStackTrace();
}
}
}
}
DJView.java
パッケージを組み合わせ;
インポートjava.awt.BorderLayout;
輸入java.awt.Dimension。
輸入java.awt.GridLayout。
輸入java.awt.event.ActionEvent。
輸入java.awt.event.ActionListener。
輸入javax.imageio.plugins.bmp.BMPImageWriteParam。
輸入javax.swing.BorderFactory。
輸入javax.swing.JButtonの。
輸入javax.swing.JFrame;
輸入javax.swing.JLabel。
輸入javax.swing.JMenuの。
輸入javax.swing.JMenuBarの。
輸入javax.swing.JMenuItemの。
輸入javax.swing.JPanel。
輸入javax.swing.JTextField。
輸入javax.swing.SwingConstants。
/ **
*视图类、它是一个观察者、同时关心实时节拍和BPM的改变
* @author管理
*
* /
パブリッククラスDJViewはのActionListener、BeatObserver、BPMObserver {実装
BeatModelInterfaceモデル。
ControllerInterfaceコントローラ。
JFrameのviewFrame;
JPanelのviewPanel;
BeatBar beatBar;
JLabelのbpmOutputLabel;
JFrameのcontrolFrame;
JPanelのControlPanelを、
JLabelのbpmLabel;
JTextFieldのbpmTextField;
JButtonのsetBPMButton;
JButtonのincreaseBPMButton;
JButtonのdecreaseBPMButton;
JMenuBarののmenuBar;
JMenuのメニュー。
JMenuItem startMenuItem;
JMenuItem stopMenuItem;
公共DJView(ControllerInterfaceコントローラ、BeatModelInterfaceモデル){
this.controller =コントローラ。
this.model =モデル。
model.registerObserver((BeatObserver)この)。
model.registerObserver((BPMObserver)この)。
}
公共ボイドCREATEVIEW(){
//ここで、すべてのSwingコンポーネント作成
viewPanel =新しいJPanelの(新しいグリッドレイアウト(1、2))。
viewFrame =新しいJFrameの( "ビュー");
viewFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
viewFrame.setSize(新次元(100、80))。
bpmOutputLabel =新しいJLabelの( "オフライン"、SwingConstants.CENTER)。
beatBar =新しいBeatBar();
beatBar.setValue(0)。
JPanelのbpmPanel =新しいJPanelの(新しいグリッドレイアウト(2、1))。
bpmPanel.add(beatBar)。
bpmPanel.add(bpmOutputLabel)。
viewPanel.add(bpmPanel)。
viewFrame.getContentPane()(viewPanel、BorderLayout.CENTER)を追加します。
viewFrame.pack();
viewFrame.setVisible(真の);
}
パブリック無効createControls(){
//ここにすべてのSwingコンポーネントを作成します
(真)JFrame.setDefaultLookAndFeelDecoratedを。
controlFrame =新しいJFrameの( "コントロール");
controlFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
controlFrame.setSize(新次元(100、80))。
ControlPanel =新しいJPanelの(新しいグリッドレイアウト(1、2))。
menuBar =新しいJMenuBarの();
メニュー=新しいJMenuに( "DJコントロール")。
startMenuItem =新しいのJMenuItem( "スタート");
menu.add(startMenuItem)。
startMenuItem.addActionListener(新規のActionListener(){
公共ボイドのactionPerformed(のActionEventイベント){
controller.start();
}
})。
stopMenuItem =新しいのJMenuItem( "停止");
menu.add(stopMenuItem)。
stopMenuItem.addActionListener(新規のActionListener(){
公共ボイドのactionPerformed(のActionEventイベント){
controller.stop();
}
})。
JMenuItem出口=新しいのJMenuItem( "終了");
exit.addActionListener(新規のActionListener(){
公共ボイドのactionPerformed(のActionEventイベント){
でSystem.exit(0);
}
})。
menu.add(出口)。
menuBar.add(メニュー)。
controlFrame.setJMenuBar(のmenuBar)。
bpmTextField =新しいJTextFieldの(2)。
bpmLabel =新しいJLabelの( "BPMを入力:"、SwingConstants.RIGHTを)。
setBPMButton =新しいJButtonの( "SET");
setBPMButton.setSize(新しい次元(10,40));
increaseBPMButton =新しいJButtonの( ">>");
decreaseBPMButton =新しいJButtonの( "<<");
setBPMButton.addActionListener(この);
increaseBPMButton.addActionListener(この);
decreaseBPMButton.addActionListener(この);
JPanelのbuttonPanel =新しいJPanelの(新しいグリッドレイアウト(1、2))。
buttonPanel.add(decreaseBPMButton)。
buttonPanel.add(increaseBPMButton)。
JPanelのenterPanel =新しいJPanelの(新しいグリッドレイアウト(1、2))。
enterPanel.add(bpmLabel)。
enterPanel.add(bpmTextField)。
JPanelのinsideControlPanel =新しいJPanelの(新しいグリッドレイアウト(3,1))。
insideControlPanel.add(enterPanel)。
insideControlPanel.add(setBPMButton)。
insideControlPanel.add(buttonPanel)。
controlPanel.add(insideControlPanel)。
bpmLabel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5))。
bpmOutputLabel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5))。
controlFrame.getRootPane()setDefaultButton(setBPMButton)。
controlFrame.getContentPane()(ControlPanelを、BorderLayout.CENTER)を追加します。
controlFrame.pack();
controlFrame.setVisible(真の);
}
公共ボイドenableStopMenuItem(){
stopMenuItem.setEnabled(TRUE)。
}
公共ボイドdisableStopMenuItem(){
stopMenuItem.setEnabled(偽)。
}
公共ボイドenableStartMenuItem(){
startMenuItem.setEnabled(TRUE)。
}
公共ボイドdisableStartMenuItem(){
startMenuItem.setEnabled(偽)。
}
公共ボイドのactionPerformed(のActionEventイベント){
IF(event.getSource()== setBPMButton){
int型BPM = Integer.parseInt(bpmTextField.getText())。
controller.setBPM(BPM)。
}他(event.getSource()== increaseBPMButton){もし
controller.increaseBPM()。
}他(event.getSource()== decreaseBPMButton){もし
controller.decreaseBPM()。
}
}
updateBPM(){公共ボイド
(!モデル= NULL)であれば{
int型のBPM = model.getBPM()。
もし(BPM == 0){
場合(!bpmOutputLabel = NULL){
bpmOutputLabel.setText( "オフライン")。
}
}他{
するif(!bpmOutputLabel = NULL){
bpmOutputLabel.setText( "現在のBPM:" + model.getBPM());
}
}
}
}
公共ボイドupdateBeat(){
IF(beatBar = NULL!){
beatBar.setValue(100)。
}
}
}
コントローラ
パッケージを組み合わせ;
パブリックインターフェイスControllerInterface {
ボイド開始();
無効停止();
)(increaseBPMを失います。
)(decreaseBPMを失います。
無効setBPM(int型BPM);
}
BeatController.javaの
組み合わせパッケージ。
/ **
*控制器的实现
* @author管理
*
* /
publicクラスBeatControllerはControllerInterface {実装
BeatModelInterfaceモデルを、
DJView図。
公共BeatController(BeatModelInterfaceモデル){
this.model =モデル。
ビュー=新しいDJView(このモデル)。
view.createView();
view.createControls();
view.disableStopMenuItem();
view.disableStartMenuItem();
model.initialize();
}
@Override
公共ボイド開始(){
model.on()。
view.disableStartMenuItem();
view.enableStopMenuItem();
}
@Override
公共ボイド停止(){
model.off()。
view.disableStopMenuItem();
view.enableStartMenuItem();
}
@Override
公共ボイドincreaseBPM(){
int型のBPM = model.getBPM()。
model.setBPM(BPM + 1)。
}
@Override
公共ボイドdecreaseBPM(){
int型のBPM = model.getBPM()。
model.setBPM(BPM - 1)。
}
@Override
公共ボイドsetBPM(int型BPM){
model.setBPM(BPM)。
}
}
テスト
DJTestDrive.java
パッケージを組み合わせ;
パブリッククラスDJTestDrive {
パブリック静的無効メイン(文字列[] args){
BeatModelInterfaceモデル=新しいBeatModel()。
ControllerInterfaceコントローラ=新しいBeatController(モデル)。
}
}
示すように、結果:
----------------
免責事項:この記事は元の記事、BY-SAの著作権契約CC 4.0に従って、再現CSDNブロガー「のIT_xiao何も」ではない、オリジナルのソースと、このリンクを添付してください声明。
オリジナルリンクします。https://blog.csdn.net/wwj_748/article/details/9747941