我的问题最好的OOP解决方案是什么?

时间:2019-01-30 01:03:14

标签: java oop design-patterns

一段时间以来,我一直在尝试更好地构建代码结构,并专注于在我的代码中越来越多地使用OOP概念。

我有一个关于以下情况的简单问题,以及如何从设计模式的角度最好地解决它。

我有一个游戏,玩家可以在其中抢劫商店。商店由Shop对象表示,抢劫由RobEvent表示。我有一个Spawner对象,当有人试图抢劫商店时,该对象负责处理有价证券。

我的中心问题是,我有一种感觉,RobEvent对象包含下面所述的太多信息和功能,并且我可以将信息和功能拆分为更多的对象,为此,我需要您的帮助!

public class Main 
{

    public static void main(String[] args)
    {

    }

    public class Shop {

        private String name;
        private Location location;
        private boolean isBeingRobbed = false;

        /*
         * Here one of the problems, should the shop have the 
         * data of the npcs, which will appear
         * in the shop when the player attempts to rob it.
         * Should it have methods to place "spawn" positions of 
         * the securities, the type, the amount etc.
         * and store it here? 
         * 
         */

        public Shop(String name, Location location){
            this.name = name;
            this.location = location;
        }

        public boolean isBeingRobbed(){
            return isBeingRobbed;
        }

        protected void setBeingRobbed(boolean bool){
            this.isBeingRobbed = bool;
        }
    }

    public class RobEvent extends Looper {

        private Shop shop;

        RobEvent(Shop shop){
            this.shop = shop;
        }

        public void start(){
            shop.setBeingRobbed(true);
        }

        @Override
        protected void logic(){
        /*
         * Big chunk of game logic
         * Spawning the securities, checking if they 
         * all appeared(they got a delay of few seconds each),
         * check if he ran away before everything 
         * spawned, check if he killed all, check if all appeared
         */
        }

        private void completed(){
            shop.setBeingRobbed(false);
        }
    }

    public class Spawner {


        /* not important things
         * 
         * just has a method to 
         * handle the spawn of a security 
         */     

        public void spawn(NPC npc){
            /*
             * spawn the npc aka security
             */
        }

    }
}

我最大的问题是logic()方法变得非常大。这是一个方法,它由超类每秒循环一次。

更多细节:

  • RobEvent必须知道它当前是否正在产生证券并做特定的事情,
  • 它必须检查是否都产生了并进行特定的操作,
  • 它必须检查玩家是否在完成之前逃脱并做一些特定的事情,
  • 它必须检查玩家是否杀死了所有人并做特定的事情等。

最烦人的是跟踪生成的证券,因为如果他逃跑了,则必须全部删除它们。我觉得这是关于此对象的太多信息,例如,我可以将跟踪生成的证券拆分到一个单独的对象中,然后在tracker.despawn有一个{具体状态。

编辑:代码实际上是对实际代码的简化。

3 个答案:

答案 0 :(得分:1)

  

RobEvent必须知道它当前是否正在产生证券并做特定的事情,-它必须检查是否都产生了证券并做特定的事情,-它必须检查玩家是否在完成之前逃跑并进行特定的事情。事情-必须检查玩家是否杀死了所有人并做特定的事情等。

这听起来像middleware usage,它将逻辑与状态分离。

快速实施

RobEvent需要跟踪RobState。您有多个RobState,例如StartSpanSecuritiesStateAllSecuritiesSpanedStatePlayerRunAwayState等。

interface RobState {
    void handle();
}

class RobEvent extends Looper implements RobState {

    // add new member
    private RobState robState;
    private Shop shop;

    RobEvent(Shop shop) {
        this.shop = shop;
        this.robState = new StartSpanSecuritiesState();
    }

    // add new setter - gets normally called only by a `State`
    void setRobState(RobState robState) {
        this.robState = robState;
    }

    // ..

}

每个RobState都知道下一个RobState,并通过setRobState的{​​{1}}对其进行设置。

RobEvent

所有修改之后,class StartSpanSecuritiesState implements RobState { private RobEvent robEvent; public StartSpanSecuritiesState(RobEvent robEvent) { this.robEvent = robEvent; } @Override public void handle() { // span your securities //... // go to the next state robEvent.setRobState(new AllSecuritiesSpanedState(robEvent)); } } 方法可能类似于:

logic

希望对您有所帮助!如果不是这次,也许是将来!
玩游戏吧:]

答案 1 :(得分:0)

就OO结构而言,类具有状态(其属性)和行为(其方法)。我将RobEvent视为Shop的一种行为,即将其移至方法而不是成为类。

对于您的logic()方法变得太长,最好知道它太长,这通常表明它做得太多。最简单的方法是将其拆分为较小的方法,每个方法执行一件特定的事情并依次调用。例如,典型的游戏循环可能类似于:

public void gameLoop(){
    while(this.gameRunning){
        this.checkUserInputs();
        this.updateGameState();
        this.updateGameDisplay();
    }
}

更短/更小的方法比冗长的方法更容易理解和维护。

答案 2 :(得分:0)

除其他答案外,我还将考虑将RobEvent建模为实际的this.productService.getProductById(id) .subscribe((data )=> {this.TotalPrice = data.Price;}); (我不是Java开发人员,也不知道如何在Java中实现这些功能)。商店被抢劫时,它会发送EventRobEvent对象可以订阅这些事件,并在每个Spawner上发送证券。 然后,如果强盗逃走,商店将发送RobEvent所订购的所有证券(或RobberRunAwayEvent)。