策略模式介绍以及headfirst上的两个实例

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。

策略模式的优缺点:
优点:
1、结构清晰,把策略分离成一个个单独的类「替换了传统的 if else」
2、代码耦合度降低,安全性提高「各个策略的细节被屏蔽」
缺点:
1、客户端必须要知道所有的策略类,否则你不知道该使用那个策略,所以策略模式适用于提前知道所有策略的情况下
2、增加了类的编写,本来只需要 if else 即可「但是这是所有模式和架构的通病」

策略模式类图:
在这里插入图片描述

下面来看两个经典的案例:
1.headfirst设计模式一书中的鸭子实例
Duck.java

package StrategyPattern;

/**
 * 鸭子超类
 */

public abstract class Duck {
    protected FlyBehavior flyBehavior;
    protected QuackBehavior quackBehavior;

    public Duck() {
    }

    public abstract void display();

    public void performFly() {
        flyBehavior.fly();
    }

    public void perormQuack() {
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("All ducks float,even decoys!");
    }

    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }
}

FlyBehavior.java

package StrategyPattern;

/**
 * 实现飞行接口的类
 */
public interface FlyBehavior {
    void fly();
}

FlyNoWay.java

package StrategyPattern;

/**
 * 不能飞
 */
public class FlyNoWay implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I can't fly!");
    }

}

FlyRocketPowered.java

package StrategyPattern;

/**
 * 用火箭飞
 */
public class FlyRocketPowered implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I'm flying with a rocket!");
    }
}

FlyWithWings.java

package StrategyPattern;

/**
 * 用翅膀飞
 */
public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I'm flying!");
    }

}

MallardDuck.java

package StrategyPattern;

/**
 * 绿头鸭
 */
public class MallardDuck extends Duck {
    public MallardDuck(){
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }
    @Override
    public void display() {
        System.out.println("I'm a real Mallard duck!");
    }
}


ModelDuck.java

package StrategyPattern;

/**
 * 模型鸭
 */
public class ModelDuck extends Duck {

    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("I'm a model duck!");
    }
}

MuteQuack.java

package StrategyPattern;

/**
 * 不会叫
 */
public class MuteQuack implements QuackBehavior{
     @Override
     public void quack()
    {
        System.out.println("<< Silence >>");
    }
}

Quack.java

package StrategyPattern;

/**
 * 呱呱叫
 */
public class Quack implements QuackBehavior{
    @Override
    public void quack()
    {
        System.out.println("Quack");
    }
}

QuackBehavior.java

package StrategyPattern;

/**
 * 实现发声接口的类
 */
public interface QuackBehavior {
    void quack();
}

Squeak.java

package StrategyPattern;

/**
 * 吱吱叫
 */
public class Squeak implements QuackBehavior{
    @Override
    public void quack()
    {
        System.out.println("Squeak");
    }
}

Test.java

package StrategyPattern;

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {

        //绿头鸭
        Duck mallard = new MallardDuck();
        mallard.perormQuack();
        mallard.performFly();

        //模型鸭
        Duck model = new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

2.headfirst设计模式一书中策略模式课后练习之冒险游戏
类图设计:
在这里插入图片描述
AxeBehavior.java

package AdventureGame;

public class AxeBehavior implements WeaponBehavior {
    @Override
    public void useWeaPon() {
        System.out.println("使用斧头");
    }
}

BowAndArrowBehavior.java

package AdventureGame;

public class BowAndArrowBehavior implements WeaponBehavior{
    @Override
    public void useWeaPon() {
        System.out.println("使用弓箭");
    }

}

King.java

package AdventureGame;

public class King extends Role {
    public King(){
        weapon=new AxeBehavior();
    }
    @Override
    void display() {
        System.out.println("这是国王");
    }
}

KnifeBehavior.java

package AdventureGame;

public class KnifeBehavior implements WeaponBehavior{
    @Override
    public void useWeaPon() {
        System.out.println("使用宝剑");
    }
}

knight.java

package AdventureGame;

public class knight extends Role {
    public knight(){
        weapon=new SwordBehavior();
    }
    @Override
    void display() {
        System.out.println("这是骑士");
    }
}

Queen.java

package AdventureGame;

public class Queen extends Role{
    public Queen(){
        weapon=new KnifeBehavior();
    }
    @Override
    void display() {
        System.out.println("这是皇后");
    }
}

Role.java

package AdventureGame;

public abstract class Role {
    WeaponBehavior weapon;
    public Role(){
    }
    public void setWeapon(WeaponBehavior weapon) {
        this.weapon = weapon;
    }
    abstract void display();
    public void weaponWay(){
        weapon.useWeaPon();
    }
}

SwordBehavior.java

package AdventureGame;

public class SwordBehavior implements WeaponBehavior{
    @Override
    public void useWeaPon() {
        System.out.println("使用匕首");
    }
}

Troll.java

package AdventureGame;

public class Troll extends Role{
    public Troll(){
        weapon=new SwordBehavior();
    }
    @Override
    void display() {
        System.out.println("这是妖怪");
    }
}

WeaponBehavior.java

package AdventureGame;

public interface WeaponBehavior {
    void useWeaPon();
}

Test.java

package AdventureGame;

public class Test {
public static void main(String[] args) {
        King king = new King();
        king.display();
        king.weaponWay();
        System.out.println("更换武器以后");
        king.setWeapon(new SwordBehavior());
        king.weaponWay();
        }
}

运行效果图:
在这里插入图片描述

策略模式就先介绍到这,以后有更深的理解时再继续补充相关内容!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值