Metronome? ? ?

Points
------------------------------------------------- -

MVC is a composite model, with observer pattern, strategy pattern and a combined mode.
Mode using the observer pattern, so as to update the viewer, while maintaining decoupling therebetween.
The controller is a policy view, the view can use different controllers, get different behavior.
View mode implemented using a combination of a user interface, the user interface is typically a combination of nested components, such as panels, frames and buttons.
These patterns work together, the three MVC mode decoupling, so they can keep a clean design and elastic.
Adapter mode for a new model adapted to the existing views and controllers.
Model 2 MVC application on the Web.
In Model 2, the controller implemented as a Servlet, and JSP / HTML implementation view


MVC pattern
------------------------------------------------ ---

 

 

 

 

 

The above is described in the picture MVC model, according to this figure to below about MVC be explained.

1, you are a user - you view and interact

A view is the model window. When you do something everything on view (for example: press the "play" button), the view controller will tell you what to do. The controller takes care of.

2, the controller changes the state of the model required.

Read your motion controller. If you press a button, the controller will understand the significance of this action, and inform the model of how to make the corresponding action.

3. The controller may also require a view to make a change.

When a controller receives the operation from the view, the structure may also need to tell it to change its view of the results. For example, the controller may be some button or menu item on the interface becomes valid or invalid.

4. When the model changes, the model would notify the view.

Whether you do certain actions (for example by pressing a button) or have some internal change (say, the beginning of the next song playlists) as long as everything inside when the model changes, the model notifies its view state changed.

The status query to the model view.

It shows a view to obtain the status directly from the model. For example, the model notify the view when a new song starts playing, the song title to view asks the model and displayed. When the controller requests to change the view, the view may also be asked to state some of the models.

 

Wearing colored glasses to see the pattern of MVC

What does the use of MVC pattern by which patterns composed it?

used:

1. Strategy Pattern

   And the controller implements the policy view mode: is a view of the object can be adjusted using different strategies, and the control strategy is provided. View only care about the visible part of the system, to interface with any behavior, are entrusted to the controller handling. Use strategy mode also allows the relationship between the view and model decoupling, because the controller responsible for the interaction model and to pass the user's request. And how to work done, view Howe knowledge.

2. Observer pattern

   Model implements the observer pattern, when the state changes, related objects will be continuously updated. Use the Observer pattern, you can make the model completely independent view and controller. The same model can use different views, you can even use multiple views at the same time.

3. The combination mode

   Displaying a window panel, buttons, text labels. If the component is not a combination of each display node (e.g. a window), it is a leaf node (e.g., a button). When the controller tells view updates, just tell the view of top-level assembly can be a combination of things will handle the rest.

 

Above is about MVC using various modes of explanation, the following look at an example introduce this blog.

 

Use MVC control the beat

BeatModelInterface.java


Combined Package;

public interface BeatModelInterface {

void the initialize (); // BeatModel after being initialized, This method is called
void on (); // open metronome
void off (); // Close metronome
void setBPM (int bpm ); // set values bmp
int getBPM (); // get the current value bmp
void RegisterObserver (BeatObserver O);
void removeObserver (BeatObserver O);
void RegisterObserver (BPMObserver O);
void removeObserver (BPMObserver O);
}

Model
BeatModel.java


Combined Package;

Import of java.util.ArrayList;

Import javax.sound.midi.MetaEventListener;
Import javax.sound.midi.MetaMessage;
Import javax.sound.midi.MidiEvent;
Import javax.sound.midi.MidiSystem;
Import javax.sound .midi.Sequence;
Import javax.sound.midi.Sequencer;
Import javax.sound.midi.ShortMessage;
Import javax.sound.midi.Track;

public class BeatModel the implements BeatModelInterface, The MetaEventListener {
sequencer sequencer; // sequencer (sequencer ) object knows how to produce a true beat
ArrayList beatObservers = new ArrayList (); // two kinds of the observer (the one observation beat An observed change BPM)
the ArrayList = new new bpmObservers the ArrayList ();
int = 90 BPM;
Sequence Sequence;
Track track;

the initialize void public () {
setUpMidi ();
buildTrackAndStart ();
}

public void ON () {
sequencer.start ();
setBPM (90);
}

public void OFF () {
setBPM (0);
sequencer.stop ();
}

public void setBPM (int BPM) {
this.bpm = BPM; // set the instance variable BPM
sequencer.setTempoInBPM (getBPM ()); // change claim sequencer BPM
notifyBPMObservers (); // notify all observers BPM , BPM has changed
}

public int getBPM () {
return BPM;
}

void beatEvent () {
notifyBeatObservers ();
}


public void RegisterObserver (BeatObserver O) {
beatObservers.add (O);
}

public void notifyBeatObservers () {
for(int i = 0; i < beatObservers.size(); i++) {
BeatObserver observer = (BeatObserver)beatObservers.get(i);
observer.updateBeat();
}
}

public void registerObserver(BPMObserver o) {
bpmObservers.add(o);
}

public void notifyBPMObservers() {
for(int i = 0; i < bpmObservers.size(); i++) {
BPMObserver observer = (BPMObserver)bpmObservers.get(i);
observer.updateBPM();
}
}


public void removeObserver(BeatObserver o) {
int i = beatObservers.indexOf(o);
if (i >= 0) {
beatObservers.remove(i);
}
}



public void removeObserver(BPMObserver o) {
int i = bpmObservers.indexOf(o);
if (i >= 0) {
bpmObservers.remove(i);
}
}


public void meta(MetaMessage message) {
if (message.getType() == 47) {
beatEvent();
sequencer.start();
setBPM(getBPM());
}
}

public void setUpMidi() {
try {
sequencer = MidiSystem.getSequencer();
sequencer.open();
sequencer.addMetaEventListener(this);
sequence = new Sequence(Sequence.PPQ,4);
track = sequence.createTrack();
sequencer.setTempoInBPM(getBPM());
} catch(Exception e) {
e.printStackTrace();
}
}

public void buildTrackAndStart() {
int[] trackList = {35, 0, 46, 0};

sequence.deleteTrack(null);
track = sequence.createTrack();

makeTracks(trackList);
track.add(makeEvent(192,9,1,0,4));
try {
sequencer.setSequence(sequence);
} catch(Exception e) {
e.printStackTrace();
}
}

public void makeTracks(int[] list) {

for (int i = 0; i < list.length; i++) {
int key = list[i];

if (key != 0) {
track.add(makeEvent(144,9,key, 100, i));
track.add(makeEvent(128,9,key, 100, i+1));
}
}
}

public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try {
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);

} catch(Exception e) {
e.printStackTrace();
}
return event;
}
}


Observer

BeatObserver.java


package combined;

public interface BeatObserver {
void updateBeat();
}


BPMObserver.java
package combined;

public interface BPMObserver {
void updateBPM();
}

View
BeatBar.java


package combined;

import javax.swing.JProgressBar;

public class BeatBar extends JProgressBar implements Runnable {
JProgressBar progressBar;
Thread thread;


public BeatBar() {
thread = new Thread(this);
setMaximum(100);
thread.start();
}


@Override
public void run() {
for(;;) {
int value = getValue();
value = (int)(value * 0.75);
setValue(value);
repaint();
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}

}

 

DJView.java

package combined;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.imageio.plugins.bmp.BMPImageWriteParam;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

/**
* 视图类,它是一个观察者,同时关心实时节拍和BPM的改变
* @author Administrator
*
*/
public class DJView implements ActionListener, BeatObserver, BPMObserver {
BeatModelInterface model;
ControllerInterface controller;
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 menu;
JMenuItem startMenuItem;
JMenuItem stopMenuItem;

public DJView(ControllerInterface controller, BeatModelInterface model) {
this.controller = controller;
this.model = model;
model.registerObserver((BeatObserver)this);
model.registerObserver((BPMObserver)this);
}

public void createView() {
// Create all Swing components here
viewPanel = new JPanel(new GridLayout(1, 2));
viewFrame = new JFrame("View");
viewFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
viewFrame.setSize(new Dimension(100, 80));
bpmOutputLabel = new JLabel("offline", SwingConstants.CENTER);
beatBar = new BeatBar();
beatBar.setValue(0);
JPanel bpmPanel = new JPanel(new GridLayout(2, 1));
bpmPanel.add(beatBar);
bpmPanel.add(bpmOutputLabel);
viewPanel.add(bpmPanel);
viewFrame.getContentPane().add(viewPanel, BorderLayout.CENTER);
viewFrame.pack();
viewFrame.setVisible(true);
}


public void createControls() {
// Create all Swing components here
JFrame.setDefaultLookAndFeelDecorated(true);
controlFrame = new JFrame("Control");
controlFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
controlFrame.setSize(new Dimension(100, 80));

controlPanel = new JPanel(new GridLayout(1, 2));

menuBar = new JMenuBar();
menu = new JMenu("DJ Control");
startMenuItem = new JMenuItem("Start");
menu.add(startMenuItem);
startMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
controller.start();
}
});
stopMenuItem = new JMenuItem("Stop");
menu.add(stopMenuItem);
stopMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
controller.stop();
}
});
JMenuItem exit = new JMenuItem("Quit");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});

menu.add(exit);
menuBar.add(menu);
controlFrame.setJMenuBar(menuBar);

bpmTextField = new JTextField(2);
bpmLabel = new JLabel("Enter BPM:", SwingConstants.RIGHT);
setBPMButton = new JButton("Set");
setBPMButton.setSize(new Dimension(10,40));
increaseBPMButton = new JButton(">>");
decreaseBPMButton = new JButton("<<");
setBPMButton.addActionListener(this);
increaseBPMButton.addActionListener(this);
decreaseBPMButton.addActionListener(this);

JPanel buttonPanel = new JPanel(new GridLayout(1, 2));

buttonPanel.add(decreaseBPMButton);
buttonPanel.add(increaseBPMButton);

JPanel enterPanel = new JPanel(new GridLayout(1, 2));
enterPanel.add(bpmLabel);
enterPanel.add(bpmTextField);
JPanel insideControlPanel = new JPanel(new GridLayout(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().add(controlPanel, BorderLayout.CENTER);

controlFrame.pack();
controlFrame.setVisible(true);
}

public void enableStopMenuItem() {
stopMenuItem.setEnabled(true);
}

public void disableStopMenuItem() {
stopMenuItem.setEnabled(false);
}

public void enableStartMenuItem() {
startMenuItem.setEnabled(true);
}

public void disableStartMenuItem() {
startMenuItem.setEnabled(false);
}

public void actionPerformed(ActionEvent event) {
if (event.getSource() == setBPMButton) {
int bpm = Integer.parseInt(bpmTextField.getText());
controller.setBPM(bpm);
} else if (event.getSource() == increaseBPMButton) {
controller.increaseBPM();
} else if (event.getSource() == decreaseBPMButton) {
controller.decreaseBPM();
}
}

public void updateBPM() {
if (model != null) {
int bpm = model.getBPM();
if (bpm == 0) {
if (bpmOutputLabel != null) {
bpmOutputLabel.setText("offline");
}
} else {
if (bpmOutputLabel != null) {
bpmOutputLabel.setText("Current BPM: " + model.getBPM());
}
}
}
}

public void updateBeat() {
if (beatBar != null) {
beatBar.setValue(100);
}
}

}

Controller

package combined;

public interface ControllerInterface {
void start();
void stop();
void increaseBPM();
void decreaseBPM();
void setBPM(int bpm);
}


BeatController.java
package combined;
/**
* 控制器的实现
* @author Administrator
*
*/
public class BeatController implements ControllerInterface {
BeatModelInterface model;
DJView view;



public BeatController(BeatModelInterface model) {
this.model = model;
view = new DJView(this, model);
view.createView();
view.createControls();
view.disableStopMenuItem();
view.disableStartMenuItem();
model.initialize();
}

@Override
public void start() {
model.on();
view.disableStartMenuItem();
view.enableStopMenuItem();
}

@Override
public void stop() {
model.off();
view.disableStopMenuItem();
view.enableStartMenuItem();
}

@Override
public void increaseBPM() {
int bpm = model.getBPM();
model.setBPM(bpm + 1);
}

@Override
public void decreaseBPM() {
int bpm = model.getBPM();
model.setBPM(bpm - 1);
}

@Override
public void setBPM(int bpm) {
model.setBPM(bpm);
}

}

Test
DJTestDrive.java


package combined;

public class DJTestDrive {

public static void main (String[] args) {
BeatModelInterface model = new BeatModel();
ControllerInterface controller = new BeatController(model);
}
}


Results as shown:

    
----------------
Disclaimer: This article is CSDN blogger "IT_xiao nothing in" original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source and this link statement.
Original link: https: //blog.csdn.net/wwj_748/article/details/9747941

Guess you like

Origin www.cnblogs.com/ffaiss/p/11653434.html