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

本文介绍了模型-视图-控制器(MVC)模式的基本概念及其在软件架构中的应用。MVC模式将应用程序分解为模型、视图和控制器三个部分,分别负责数据管理、用户界面展示和用户交互处理。文中还通过具体代码示例展示了MVC模式如何在实际项目中实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型-视图-控制器(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);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值