2013-12-24 3 views
1

Я довольно новичок в Java, и я довольно долго борется со следующим.Как создать класс с несколькими (взаимозаменяемыми) поведением

У меня есть этот класс «Человек» в моем проекте, и в качестве части моей модели я хотел бы, чтобы мои люди могли специализироваться и, следовательно, иметь новое поведение. Например, у меня мог бы быть человек, который начинался бы как «Гражданский», но позже мог бы превратиться в «Солдат» и узнать новое поведение.

Я использовал это в Smalltalk, добавив переменную экземпляра в мой класс «Человек», который будет указывать на экземпляр «Civil», поэтому я мог бы указать на новый экземпляр «Солдат» позже в игре, но теперь, когда в Java я ограничен типами, я не уверен, как ее решить (я не думаю, что добавление одной переменной экземпляра для каждого возможного типа может быть возможным решением, но я могу ошибаться) ,

Итак, как бы вы это сформулировали? Любой намек на то, как я могу заняться этим, будет очень признателен!

+0

Может Humna быть более чем один из этих типов? и что именно в Smalltalk вы имеете в виду – Mark

ответ

1

Дизайн-шаблоны приходят в этой ситуации.

Вы ищете динамическое расширение объекта, узор Decorator поможет вам справиться с этим. Другим простым способом сделать это будет стратегия стратегии, где солдат будет стратегией, гражданская стратегия будет, вы добавите ее к объекту человека, теперь этот человек станет солдатом или гражданским и т.д.,

2
class Human { 
    Job job = new Civil(); 
} 

interface Job { 
    void work(); 
} 

class Civil implements Job { 
    void work() { 
     cutDownTrees(); 
    } 
} 

class Soldier implemets Job { 
    void work() { 
     lookForEnemies(); 
    } 
} 
3

Вы можете использовать композицию вместо наследования. Таким образом, у человека будет переменная внутри нее, которая представляет ее поведение. Вы могли бы назвать это HumanBehaviour. Расширьте HumanBehaviour и создайте SoldierBehaviour и CivilBehaviour. Таким образом, вы можете изменить поведение своего экземпляра в любое время. просто сделайте myHuman.setBehaviour (новый SoldierBehaviour()) или myHuman.setBehaviour (новый CivilBehaviour());

2

Похоже, вам нужен Strategy design pattern.

В вашем случае вы должны создать интерфейс Behaviour, реализованный классами Civil и Soldier:

public interface Behavior { 
    void doSmthg(); 
} 

public class Civil implements Behavior { 
    void doSmthg(){ /* do it like a civil! */ } 
} 

public class Soldier implements Behavior { 
    void doSmthg(){ /* do it like a soldier! */ } 
} 

public class Human { 

    private Behavior behavior = new Civil(); 

    public void setBehavior(Behavior b) { 
    this.behavior = b; 
    } 
} 
+0

Спасибо, помощник! это, кажется, решение, которое приспосабливает больше всего к моим потребностям (другие тоже были замечательными) Кажется, мне не хватало знаний о шаблоне дизайна стратегии, отличной статье. У меня есть еще одно сомнение. Что делать, если я хотел бы добавить поведение человека к человеку (например, способность использовать оружие на случай, если он превратится в солдата), и что это поведение не было доступно для гражданских лиц? Я могу думать о таких поворотах, как внедрение фиктивных поведений для гражданских лиц, но, возможно, это не лучшее решение? –

+0

Вы также можете проверить шаблон дизайна Decorator. В вашем случае, не Солдат, просто человек, украшенный униформой и оружием? – Guillaume

Смежные вопросы