问题描述
||
我最近写了一个Java纸牌游戏,并将所有游戏逻辑编写在一个称为Game的类中。在可能的情况下,我尝试将所有GUI处理保持在此类之外。我现在正在尝试将此游戏转换为Android应用程序。
然后在playAutomaticTurn()方法(由Android Activity和Java桌面应用程序使用)中,如果计算机播放器希望宣布自己已经赢了,我便在Game中调用另一个方法。使用我创建的SoundEffect类(使用javax.sound.sampled。*库),该方法根据结果播放两种声音效果。
而不是完全重写代码以将声音效果移回调用方法(我想我必须从我的notifyWin()方法返回状态,然后从playAutomaticTurn()返回此状态)是否有一种简洁的方法确定主调用应用程序是否为Android?
这样,我可以放置if或case语句,并以不同的方式处理声音效果?
例如。
if (androidApp) {
playAndroidSoundEffect
} else {
playJavaxSoundEffect();
}
还是在类的开头创建常量声明并使用Java和Android版本的不同值进行编译的唯一方法?
例如。编译适用于Android的版本(尚未实现Android声音)
private static final boolean SOUND = false;
//...
if (SOUND)
playJavaxSoundEffect();
感谢您提供的任何帮助和建议。
解决方法
在您的代码中闪出很多ѭ2是不好的做法,我建议创建一个捕获平台特定行为的接口,例如
interface SoundService {
playSound(/* ... */);
}
这样,您可以创建接口的多个实现,包括用于懒惰的琐碎的“ 4”实现,并使所有平台特定的代码都位于非常可视的位置。
, 在黑暗中拍摄
您能否使用反射为仅在android中可用的库创建布尔值:
boolean isAndroid = false;
try {
Context.class.getMethod(\"getApplicationContext\",null);
isAndroid = true;
} catch (NoSuchMethodException e) {
isAndroid = false;
} catch (Exception e) {
isAndroid = false;
}
, 使用Waldheinz和Blundell的思想,我们可以创建基本的工厂模式,我们可以看到Game不需要了解平台依赖性...并且所有Sound对象的初始化都是在工厂完成的,而确定要创建哪种对象的决定就是工厂的决定。 ...和布隆德尔的方法可以用于相同的
请找到示例工厂模式代码http://www.devdaily.com/java/java-factory-pattern-example