博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Head First 设计模式》学习笔记——复合模式
阅读量:7144 次
发布时间:2019-06-29

本文共 4113 字,大约阅读时间需要 13 分钟。

模型-视图-控制器(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
beatObservers = new ArrayList
(); ArrayList
bpmObservers = new ArrayList
(); 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); }}

转载地址:http://umgrl.baihongyu.com/

你可能感兴趣的文章
Chrome 自动填充的表单是淡黄色的背景,有方法自定义
查看>>
hough变换中,直线方程从XY空间转换到参数空间的转换过程
查看>>
阿里云server该数据光盘安装操作
查看>>
Onedrive 明年初基础容量缩小到5G,执行这一步骤避免(保持30G)
查看>>
IOS中NSUserDefaults的用法(轻量级本地数据存储)
查看>>
大组合取模之:1<=n<=m<=1e6,1<=p<=1e9
查看>>
百度map android sdk3.5实现定位 并跳转的指定坐标,加入标记
查看>>
Oracle VM VirtualBox技巧
查看>>
怎样自己构建一个小型的Zoomeye----从技术细节探讨到实现
查看>>
Hadoop 2.7.1 源代码目录结构分析
查看>>
《转》 Openstack Grizzly 指定 compute node 创建 instance
查看>>
[转]PhoneGap使用PushPlugin插件实现消息推送
查看>>
PHP传值与传址(引用)
查看>>
JSP简单练习-数组应用实例
查看>>
Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
查看>>
DMA(STM32)
查看>>
最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
查看>>
Boost.Asio基础(三)
查看>>
【转载】学习新东西的唯一方法
查看>>
[转]Android dex分包方案
查看>>