Oop 在不破坏封装的情况下调用不同对象的方法
我有一个对象Oop 在不破坏封装的情况下调用不同对象的方法,oop,design-patterns,encapsulation,Oop,Design Patterns,Encapsulation,我有一个对象GameLogic,它有一个Player(接口)对象 GameLogic有一个方法getAvailableMoves(),在GameLogic中使用该方法,让Player了解其可用的移动 我目前正在实现一个AIPlayer(实现Player),它应该使用Minimax算法作为一种策略。为此,我希望能够从AIPlayer内部使用GameLogic的getAvailableMoves()方法。但是,我希望在不破坏封装的情况下做到这一点。也就是说,我试图避免传递GameLogic作为对Pl
GameLogic
,它有一个Player
(接口)对象
GameLogic
有一个方法getAvailableMoves()
,在GameLogic
中使用该方法,让Player
了解其可用的移动
我目前正在实现一个AIPlayer
(实现Player
),它应该使用Minimax算法作为一种策略。为此,我希望能够从AIPlayer
内部使用GameLogic
的getAvailableMoves()
方法。但是,我希望在不破坏封装的情况下做到这一点。也就是说,我试图避免传递GameLogic
作为对Player
的引用
对于这种情况,什么是合适的解决方案?我想我应该使用一种设计模式,但我不确定是哪种模式。如果你想向一个对象发送消息,你的对象通常需要对它有一些了解(除非你想把它作为一个事件来实现,这看起来很尴尬)。如果您关心在AIPlayer类和GameLogic之间创建紧密耦合,那么您可以仅为该方法创建一个接口,让GameLogic实现它,然后将其传递给AIPlayer。这样,AIPlayer的唯一依赖性是界面,而不是特定的GameLogic实现。如果您希望能够向一个对象发送消息,您的对象通常需要对它有一些了解(除非您希望将它作为一个事件来实现,这看起来很尴尬)。如果您关心在AIPlayer类和GameLogic之间创建紧密耦合,那么您可以仅为该方法创建一个接口,让GameLogic实现它,然后将其传递给AIPlayer。这样,AIPlayer的唯一依赖性是界面,而不是特定的GameLogic实现。方法1:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
不需要在播放器内部调用getAvailableMoves,而是从外部调用,您可以在getAvailableMoves:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
游戏逻辑类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
玩家等级
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
AIPlayer类
class AIPlayer extends Player {
void move(){
}
}
方法2:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
另一种方法是使getAvailableMoves保持静态,并从player类内部调用它
AIPlayer类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
游戏逻辑类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
方法1:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
不需要在播放器内部调用getAvailableMoves,而是从外部调用,您可以在getAvailableMoves:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
游戏逻辑类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
玩家等级
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
AIPlayer类
class AIPlayer extends Player {
void move(){
}
}
方法2:
class GameWorld {
main(){
GameLogic gl = new GameLogic();
AIPlayer player = new AIPlayer();
player.move(gl.getAvailableMoves(player));
}
}
另一种方法是使getAvailableMoves保持静态,并从player类内部调用它
AIPlayer类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
游戏逻辑类
class GameLogic {
public object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
class Player{
float x;
float y;
}
class AIPlayer extends Player {
void move(){
GameLogic.getAvailableMoves(this);
}
}
class GameLogic {
public static object getAvailableMoves(Player player){
player.getX();
player.getY();
return availableMoves;
}
}
你需要一个服务类,你需要一个服务类。