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


    模型-视图-控制器(MVC模式)是一种很经典的软件架构模式。在UI框架和UI设计思路中扮演着很重要的角色。从设计模式的角度来看,MVC模式是一种复合模式。它将多个设计模式在一种解决方式中结合起来,用来解决很多设计问题。MVC模式把用户界面交互分拆到不同的三种角色中,使应用程序被分成三个核心部件:Model(模型)、View(视图)、Control(控制器)。————题记

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

    模型-视图-控制器
    模型:模型持有全部的数据、状态和程序逻辑。模型没有注意到视图和控制器。尽管他提供了操纵和检索状态的接口。并发送状态改变给观察者。
    控制器:取得用户的输入并解读其对模型的意思。

    视图:用来呈现模型,视图通常直接从模型中取得它须要显示的状态和数据。
    从模式角度看:
    模型利用“观察者”让控制器和视图能够随最新的状态改变而更新。
    还有一方面。视图和控制器则实现了“策略模式”。

    控制器是视图的行为。假设你希望有不同的行为。能够直接换一个控制器。

    视图内部使用组合模式管理窗体、button以及其它显示组件。

    MVC与WEB——Model 2
    Web开发者也都在适配MVC,使他符合浏览器/server模型。使用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;
    	//显示控制button
    	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);
    	}
    }
    



  • 相关阅读:
    Hibernate——openSession和getCurrentSession区别
    Oracle存储过程分页 详解
    如何破解mysql数据库的密码
    Oracle约束详解
    Oracle分页查询
    Oracle如何管理权限和角色
    悲观锁和乐观锁详解
    Oracle控制结构详解
    Rose建模之各模型分析
    div布局中将页面居中的方法
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7101440.html
Copyright © 2020-2023  润新知