gpt4 book ai didi

java - 装饰图案钢琴应用

转载 作者:行者123 更新时间:2023-12-01 10:30:49 25 4
gpt4 key购买 nike

我正在尝试应用装饰器模式,但到目前为止我无法让它按照我想要的方式工作。

基本上,我正在尝试创建一个钢琴应用程序,该应用程序具有扩展 JavaFX 矩形的钢琴键父类(super class)和两个子类白键和黑键,当您将鼠标悬停在它们上方时,这两个子类都具有方法的实现。

它们工作正常,但我现在正在尝试创建装饰器类,该类将通过提供自己的播放方法并附加该装饰器的音频文件的相关字符串来覆盖父类(super class)的播放方法。例如PianoKeyViolinDecorator 在播放之前会将“violin”附加到音频文件名的末尾。

播放方法有效,但将鼠标悬停在矩形上的方法不起作用。除非我在装饰器中设置高度和宽度,否则矩形不会显示在我的 GUI 中。有没有办法让钢琴键的矩形显示出来,而不必在装饰器类中重新创建新的矩形?

这是我的装饰器类:

public class PianoKeyDecorator extends KeyView {

private KeyView keyView;

public PianoKeyDecorator(KeyView keyView) {
this.keyView = keyView;
}

public void lightOn() {
keyView.lightOn();
}

public void lightOff() {
keyView.lightOff();
}

@Override
public void play() {
AudioClip audioFile = new AudioClip(AssignmentTemplate.class.getResource(keyView.keyAudioSource() + "_violin.wav").toExternalForm());
audioFile.play();
}

还有我的父类(super class)

public abstract class KeyView extends Rectangle {

private AudioClip keyAudio;
private String keyAudioSource;
private String keyId;
private String background;
private String backgroundHover;

public KeyView(double width, double height, String keyAudioSource, String keyText, String background, String backgroundHover) {
this.keyAudioSource = keyAudioSource;
keyAudio = new AudioClip(AssignmentTemplate.class.getResource(keyAudioSource + ".wav").toExternalForm());
this.background = AssignmentTemplate.class.getResource("resources/"+ background).toExternalForm();
this.backgroundHover = AssignmentTemplate.class.getResource("resources/"+ backgroundHover).toExternalForm();
this.getStyleClass().add("key");
setWidth(width);
setHeight(height);
}

public KeyView(){}

public void play() {
keyAudio.play();
}

public void setAudioClip(AudioClip keyAudio) {
this.keyAudio = keyAudio;
}

public abstract void lightOn();
public abstract void lightOff();

public void setKeyId(String keyId) {
this.keyId = keyId;
}

public String getKeyId() {
return keyId;
}

public String getBackground() {
return background;
}

public String getBackgroundHover() {
return backgroundHover;
}

public String keyAudioSource() {
return keyAudioSource;
}

这是我的子类之一

公共(public)类 BlackKeyView 扩展 KeyView {

public SharpKeyView(String keyAudioFile, String keyText, String background, String backgroundHover) {
super(64, 170, keyAudioFile, keyText, background, backgroundHover);
setKeyId("sharp" + keyText);
}

public void lightOn() {
super.setFill(Color.BLUE);
}

public void lightOff() {
super.setFill(Color.BLACK);
}

最佳答案

最简单的方法可能是将装饰器的所有相关属性绑定(bind)到底层对象:

public PianoKeyDecorator(KeyView keyView) {
this.keyView = keyView;
fillProperty().bindBidirectional(keyView.fillProperty());
// bind any other properties you wish to change.
}

另一种方法可能是将键的 View 部分与其逻辑完全分离,但这可能会迫使您相当大地改变您的设计。

编辑:
想想看,我认为对于这个例子来说 strategy设计模式可能比装饰器更适合,因此您只需更改声音的播放方式而不是整个键。

关于java - 装饰图案钢琴应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com