《Head First 设计模式》学习笔记——复合模式
控制器是视图的行为。假设你希望有不同的行为。能够直接换一个控制器。
JSP的唯一工作就是产生页面表现模型的视图,以及进一步动作所须要的全部控件。
//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);
}
}
《Head First 设计模式》学习笔记——复合模式的更多相关文章
- Java-马士兵设计模式学习笔记-命令模式
一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...
- Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口
续上一篇 <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...
- Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...
- Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较
一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
- Java-马士兵设计模式学习笔记-建造者模式
一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...
随机推荐
- 汇编程序10:计算长度为C字节的数据和
assume cs:code code segment mov ax,0ffffh //起始段地址 mov ds,ax mov bx,0 //偏移变量 mov dx,0 //保存结果 mov cx,1 ...
- html中<a>标签_top和_parent的区别
在html中,<a>标签有个target属性,而targe属性有四个值,分别是:_blank._self._top._parent.前两个相信很好理解,第一个就是在新窗口中打开的意思,第二 ...
- 自学Python六 爬虫基础必不可少的正则
要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,不过正则好像好烦人的样子,那么如何做呢,熟 ...
- Elasticsearch中的segment理解
https://blog.csdn.net/smithallenyu/article/details/52789872 参照图 https://www.cnblogs.com/smile361/p/7 ...
- objc_setAssociatedObject获取cell上button对应所在的行
#import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property (weak, nonatomic) IBOu ...
- 【java基础】(6)内部类
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...
- DeltaFish 校园物资共享平台 第六次小组会议
DeltaFish 校园物资共享平台 第六次小组会议 记录人:娄雨禛 2018.6.3 任务进度(2018.5.28-2018.6.3) 前端 李鑫:商品详情界面设计.总体配色分析 刘鼎乾:卖家页面初 ...
- java程序员级别划分
IT路虽好,却难走.1级 为会基本语法 大学里的JAVA教程 能及格 2级 自己可以写个 俄罗斯方块,扫雷,贪吃蛇, 拼图之类的小游戏 3级 能够进手机游戏CP,SP公司,做手机游戏 或者 ...
- MVC5+EasyUI+EF6+Linq通用权限系统出炉--登录(2)
1.输入验证码后 自动识别验证码并登录.
- 【转】linux命令
shell实例手册 0 说明{ 手册制作: 雪松 更新日期: 2015-11-02 欢迎系统运维加入Q群: 198173206 # 加群请回答问题 欢迎运维开发加入Q群: 3655344 ...