Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在不破坏封装的情况下调用不同对象的方法_Oop_Design Patterns_Encapsulation - Fatal编程技术网

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;
     }
    }

你需要一个服务类,你需要一个服务类。