策略模式(Strategy)

1 概念

  • 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变化独立于算法的使用者。

图片说明

2 实现

package com.xianhuii.designpattern;

public class Strategy {
    public static void main(String[] args) {
        NormalZombie normalZombie = new NormalZombie();
        normalZombie.display();
        normalZombie.attack();
        normalZombie.move();
        normalZombie.setAttackable(new HitAttack());
        normalZombie.attack();
    }
}

interface Moveable {
    void move();
}
interface Attackable {
    void attack();
}

abstract class Zombie {
    abstract public void display();
    Moveable moveable;
    Attackable attackable;

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

    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 StepByStepMove implements Moveable {

    @Override
    public void move() {
        System.out.println("一步一步移动");
    }
}

class BiteAttack implements Attackable {

    @Override
    public void attack() {
        System.out.println("咬");
    }
}

class HitAttack implements Attackable {

    @Override
    public void attack() {
        System.out.println("打");
    }
}

class NormalZombie extends Zombie {

    public NormalZombie() {
        super(new StepByStepMove(), new BiteAttack());
    }
    public NormalZombie(Moveable moveable, Attackable attackable) {
        super(moveable, attackable);
    }

    @Override
    public void display() {
        System.out.println("普通僵尸");
    }

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

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

class FlagZombie extends Zombie {

    public FlagZombie() {
        super(new StepByStepMove(), new BiteAttack());
    }

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

    @Override
    public void display() {
        System.out.println("旗手僵尸");
    }

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

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