【Java】设计模式之策略模式

好记性不如烂笔头,记录一下策略模式

什么是策略模式?

实际上策略模式属于对象的行为模式,针对一组可以相互替换的行为又不影响到最终结果而发生改变的情况。

使用

如图所示,将一组需要切换的行为定义成抽象的放入Context类中,通过构造器或者Setter的方式来切换行为。

在这里插入图片描述

举例

应用: 继承角色类的国王王后等角色可以随时切换并使用武器

public class Strategy {
    public static void main(String[] args) {
        Character c1 = new King();
        c1.useWeapon();
        Character c2 = new Knight();
        c2.useWeapon();
        Character c3 = new Queen();
        c3.useWeapon();
        Character c4 = new Troll();
        c4.useWeapon();
        c1.setWeapon(new NoWeaponBehavior());
        c1.useWeapon();
    }
}

interface WeaponBehavior{
    void useWeapon();
}

abstract class Character{
    WeaponBehavior weapon = new NoWeaponBehavior();

    void useWeapon() {
        System.out.print(this.getClass().getSimpleName() + " : ");
        this.weapon.useWeapon();
    }

    void setWeapon(WeaponBehavior weapon) {
        System.out.print("switch weapon ... ");
        this.weapon = weapon;
    }
}

class King extends Character {
    public King() {
        weapon = new SwordWeaponBehavior();
    }
}
class Queen extends Character {
    public Queen() {
        weapon = new BowAndArrowWeaponBehavior();
    }
}
class Troll extends Character {
    public Troll() {
        weapon = new DaggerWeapon();
    }
}
class Knight extends Character {
    public Knight() {
        weapon = new ShieldWeapon();
    }
}

class NoWeaponBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use bare hand...");
    }
}

class DaggerWeapon implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use dagger...");
    }
}

class ShieldWeapon implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use shield...");
    }
}

class BowAndArrowWeaponBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use bow and arrow...");
    }
}

class SwordWeaponBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use sword...");
    }
}

class AxeWeaponBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("use axe...");
    }
}

结果如下:

King : use sword...
Knight : use shield...
Queen : use bow and arrow...
Troll : use dagger...
King : use bare hand...

Process finished with exit code 0

总结

策略模式的优点在于灵活,可扩展性强,具有更好的维护性;但是缺点也很明显,使用者必须知道所有的策略类,并自行决定使用哪一个策略类。同时如上面优点所说,由于策略模式可扩展性强(有一个行为就扩展一个类),因此对象的数目十分可观。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值