public class StrategyTest {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.move();
        dog.setMoveable(new DogMove());
        dog.move();
    }
}

interface Moveable{
    void move();
}
interface Attackable{
    void attack();
}
class Runable implements Moveable{

    @Override
    public void move() {
        System.out.println("------ run -----");
    }
}

class DogMove implements Moveable{

    @Override
    public void move() {
        System.out.println("狗摇着尾巴移动");
    }
}

abstract class Animal{
    Moveable moveable;
    Attackable attackable;

    public Animal() {
    }

    public Animal(Moveable moveable, Attackable attackable) {
        this.moveable = moveable;
        this.attackable = attackable;
    }

    abstract public void display();
    abstract void move();
    abstract void attack();

    public Moveable getMoveable() {
        return moveable;
    }

    public void setMoveable(Moveable moveable) {
        this.moveable = moveable;
    }

    public Attackable getAttackable() {
        return attackable;
    }

    public void setAttackable(Attackable attackable) {
        this.attackable = attackable;
    }
}


class Dog extends Animal{
    public Dog() {
        super(new Runable(), null);
    }

    public Dog(Moveable moveable, Attackable attackable) {
        super(moveable, attackable);
    }

    @Override
    public void display() {
        System.out.println("------ 狗 ----------");
    }

    @Override
    void move() {
        moveable.move();
    }

    @Override
    void attack() {
        attackable.attack();
    }
}