我正在尝试找出最佳的设计模式来管理两个相互作用的对象之间的“竞争”。例如,如果我想要一个追逐
这种情况下是否有已经建立的设计模式?
这是我能想到的最好的方法:一个类来代表承载这两个对象的环境。我保持它非常简单,并假设动物只会直线奔跑,如果狐狸靠近兔子咬兔子,狐狸就会抓到兔子。以下是一些演示我所描述的内容的代码。我使用PHP是因为我可以快速地编写它,但我不想关注语言的具体细节。我的问题实际上是关于设计模式/架构的。
我发现这种方法存在两个即时问题:
Rabbit
类的Fox
类通过一个简单的环境。我想让它们“竞争”,并找出谁赢了。最终它将成为一个教学工具,学生可以用来实验继承和其他面向对象编程技巧。这种情况下是否有已经建立的设计模式?
这是我能想到的最好的方法:一个类来代表承载这两个对象的环境。我保持它非常简单,并假设动物只会直线奔跑,如果狐狸靠近兔子咬兔子,狐狸就会抓到兔子。以下是一些演示我所描述的内容的代码。我使用PHP是因为我可以快速地编写它,但我不想关注语言的具体细节。我的问题实际上是关于设计模式/架构的。
class Forrest() {
public $fox;
public $rabbit;
public $width = 100; //meters?
public $length = 100;
__construct() {
$this->fox = new Fox();
$this->rabbit = new Rabbit();
$this->theChase();
}
public function theChase() {
while (!$this->rabbit->isBitten) {
$this->rabbit->react($fox);
$this->fox->react($rabbit);
}
log('The fox got the rabbit!');
}
}
abstract class Animal() {
public $speed;
public $hasTeeth = false;
public $position;
public $direction;
public $isBitten = false;
public function run($distance) {
// update coordinates based on direction and speed
}
public function bite($someone) {
if (isCloseEnough( $someone ) && $this->hasTeeth) {
$someone->isBitten = true;
log(get_class($this) . ' bit the ' . get_class($someone)); //the Fox bit the Rabbit
}
}
public abstract function react($someone);
}
class Rabbit extends Animal {
__construct() {
$this->speed = 30;
$this->position = [0,0];
$this->direction = 'north';
log(get_class($this) . ' starts at 0,0');
}
public react($fox) {
//avoid the fox
}
}
class Fox extends Animal {
__construct() {
$this->speed = 20;
$this->position = [100,100];
$this->direction = 'south';
log (get_class($this) . ' starts at 100,100');
}
public react($rabbit) {
//try to catch the rabbit
}
}
我发现这种方法存在两个即时问题:
- 这种架构会导致顺序交替动作。换句话说,首先兔子做某事,然后狐狸做某事,然后兔子再做某事……这更像是一种纸牌游戏,每个玩家轮流移动。如果两个对象都能同时做出反应,那将会更有趣。
- 目前还没有限制每个“回合”活动量的系统。需要对单个“回合”中发生的事情进行某种限制,以保持趣味性。否则,狐狸可以简单地
run()
run()
run()
...... 直到在第一回合就抓住了兔子。