《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 ...
随机推荐
- protobuf 编译 java js文件详解
首先下载protobuf.exe 下载地址:https://download.csdn.net/download/qq_34756156/10220137 MessageBody.proto synt ...
- Spring boot (12) tomcat jdbc连接池
默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...
- JQuery 一些特殊符号的使用
前言:我写博客的频率与我的清闲程度成正比.. 太闲了所以想记录一下JQuery里的特殊符号,级别:入门级.用到哪里写到哪里,不全面是肯定的. 其实只要接触前端就肯定少不了用jquery,但是以前太 ...
- java基础学习四
一.java中的基本数据类型 二.double和float精度不准的问题 double和float本身确实存在某种缺陷,不能用于精确计算. 解决办法: 用java.math.BigDecimal,通过 ...
- [2月1号] 努比亚全机型ROM贴 最全最新NubiaUI5.0 ROOT 极速体验
前言 感谢在开发过程中mandfx和dgtl198312予以的帮助!本帖将整理所有Nubia手机的最新刷机包,还有少数机型未制作刷机包,需要的机油可以联系我制作recovery以及刷机包加群23722 ...
- PHP CURL的几种用法
1.抓取无访问控制文件 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/ ...
- java程序员级别划分
IT路虽好,却难走.1级 为会基本语法 大学里的JAVA教程 能及格 2级 自己可以写个 俄罗斯方块,扫雷,贪吃蛇, 拼图之类的小游戏 3级 能够进手机游戏CP,SP公司,做手机游戏 或者 ...
- git与pycharm结合使用
一.配置pycharm 在pycharm中选择file-->setting,在弹出的窗口中选择version control,选择git,配置git的路径 将当前项目关闭 在弹出的窗口中选择ch ...
- python核心编程中的对象值比较VS对象身份比较(转载)
转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...
- Having子句用法
Having基础用法 集合结果指定条件 注:HAVING子句中能够使用三种要素:常数,聚合函数,GROUP BY子句中指定的列名(聚合建) HAVING子句: 用having就一定要和group by ...