State Design Pattern in Java

The beginning of a case statement has taken seed in Property.landOnBy()

This can be remedied with the State design pattern.

class Player {
    private String name;
    private int money;

    public Player(String n, int m) {
        name = n;
        money = m;
    }

    public String getName() {
        return name;
    }

    public int getWorth() {
        return money;
    }

    public void debit(int m) {
        money -= m;
    }

    public void credit(int m) {
        money += m;
    }
}

class Property {
    private String name;
    private int price;
    private int rent;
    private Player owner;

    public Property(String name) {
        this.name = name;
        price = 100;
        rent = 10;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    public int getRent() {
        return rent;
    }

    public Player getOwner() {
        return owner;
    }

    public void setOwner(Player p) {
        owner = p;
    }

    void landOnBy(Player p) {
        System.out.print(p.getName() + " landed on " + name);
        if (getOwner() == null) {
            System.out.print(" - not owned\n" + p.getName());
            if (p.getWorth() < getPrice()) {
                System.out.println(" does not have enough money to purchase");
            } else {
                p.debit(getPrice());
                setOwner(p);
                System.out.println(" bought " + getName());
            }
        } else {
            System.out.println(" - owned by " + getOwner().getName());
            if (p != getOwner()) {
                p.debit(getRent());
                getOwner().credit(getRent());
                System.out.println(getOwner().getName() + " now has "
                        + getOwner().getWorth() + " dollars");
            }
        }
        System.out.println(p.getName() + " has " + p.getWorth()
                + " dollars");
    }
}

public class StateDemo {
    public static void main(String[] args) {
        Player p1 = new Player("Tom", 50);
        Player p2 = new Player("   Dick", 500);
        Property prop = new Property("Boardwalk");
        prop.landOnBy(p1);
        prop.landOnBy(p2);
        prop.landOnBy(p1);
        prop.landOnBy(p2);
        prop.landOnBy(p1);
    }
}

Output

Tom landed on Boardwalk - not owned
Tom does not have enough money to purchase
Tom has 50 dollars
   Dick landed on Boardwalk - not owned
   Dick bought Boardwalk
   Dick has 400 dollars
Tom landed on Boardwalk - owned by    Dick
   Dick now has 410 dollars
Tom has 40 dollars
   Dick landed on Boardwalk - owned by    Dick
   Dick has 410 dollars
Tom landed on Boardwalk - owned by    Dick
   Dick now has 420 dollars
Tom has 30 dollars

Code examples