《Head First 设计模式》学习笔记——复合模式

来源:互联网 发布:java list 相同的元素 编辑:程序博客网 时间:2024/05/20 14:44
模型-视图-控制器(MVC模式)是一种非常经典的软件架构模式,在UI框架和UI设计思路中扮演着非常重要的角色。从设计模式的角度来看,MVC模式是一种复合模式,它将多个设计模式在一种解决方案中结合起来,用来解决许多设计问题。MVC模式把用户界面交互分拆到不同的三种角色中,使应用程序被分成三个核心部件:Model(模型)、View(视图)、Control(控制器)。————题记

设计模式
复合模式:结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。如MVC和Model 2

模型-视图-控制器
模型:模型持有所有的数据、状态和程序逻辑,模型没有注意到视图和控制器,虽然他提供了操纵和检索状态的接口,并发送状态改变给观察者。
控制器:取得用户的输入并解读其对模型的意思。
视图:用来呈现模型,视图通常直接从模型中取得它需要显示的状态和数据。
从模式角度看:
模型利用“观察者”让控制器和视图可以随最新的状态改变而更新。
另一方面,视图和控制器则实现了“策略模式”。控制器是视图的行为,如果你希望有不同的行为,可以直接换一个控制器。
视图内部使用组合模式管理窗口、按钮以及其他显示组件。

MVC与WEB——Model 2
Web开发人员也都在适配MVC,使他符合浏览器/服务器模型。使用Servlet和JSP技术的组合,达到MVC的分离效果。就像传统的GUI。
(1)客户发出一个会被Servlet收到的HTTP请求。
(2)Servlet扮演控制器,处理请求,通常会向模型(一般是数据库)发出请求。处理结果往往以JavaBean的形式打包。
(3)控制器将控制权交给视图JSP。JSP的唯一工作就是产生页面表现模型的视图,以及进一步动作所需要的所有控件。
(4)视图通过HTTP将页面返回浏览器。
//MVC//模型public interface BeatModelInterface {//这些方法让控制器调用。控制器根据用户的操作对模型做出适当的处理void initialize();void on();void off();void setBPM(int bpm);//这些方法允许视图和控制器取得状态,并且成为观察者。int getBPM();void registerObserver(BeatObserver o);void removeObserver(BeatObserver o);void registerObserver(BPMObserver o);void removeObserver(BPMObserver o);}public class BeatModel implements BeatModelInterface, MetaEventListener {Sequencer sequencer;//两种观察者,一种观察节拍,一种观察BPM变化ArrayList<BeatObserver> beatObservers = new ArrayList<BeatObserver>();ArrayList<BPMObserver> bpmObservers = new ArrayList<BPMObserver>();int bpm = 90;Sequence sequence;Track track;public void initialize() {setUpMidi();buildTrackAndStart();}public void on() {sequencer.start();setBPM(90);}public void off() {setBPM(0);sequencer.stop();}public void setBPM(int bpm) {this.bpm = bpm;sequencer.setTempoInBPM(getBPM());notifyBPMObservers();}public int getBPM() {return bpm;}void beatEvent() {notifyBeatObservers();}//注册观察者、通知观察者的代码//处理节拍的MIDI代码}//视图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}//模型发生变化是,updateBPM()方法会被调用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);}}}//控制器public interface ControllerInterface {//视图能调用所有的控制器方法都在丽丽void start();void stop();void increaseBPM();void decreaseBPM();void setBPM(int bpm);}//实现ControllerInterface接口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.enableStartMenuItem();model.initialize();}public void start() {model.on();view.disableStartMenuItem();view.enableStopMenuItem();}public void stop() {model.off();view.disableStopMenuItem();view.enableStartMenuItem();}public void increaseBPM() {int bpm = model.getBPM();model.setBPM(bpm + 1);}public void decreaseBPM() {int bpm = model.getBPM();model.setBPM(bpm - 1);}public void setBPM(int bpm) {model.setBPM(bpm);}}public class DJTestDrive {public static void main(String[] args) {BeatModelInterface model = new BeatModel();//由控制器创建视图ControllerInterface controller = new BeatController(model);}}



0 0
原创粉丝点击