【design pattern】行为型模式之— 策略模式(strategy)

   原文:oodesign

产生的诱因

     当 多个类 仅仅在 行为上有所不同时,这个时候可以选择 将不同的行为的实现算法 孤立 在不同的类中,以达到在运行时可以选择不同的算法的目的。


思路

    定义一个算法族,每个算法单独封装 使他们可以互换;策略模式 让 算法 独立于 使用它的客户端。


UML 类图


IStrategy  接口: 所有算法族必须实现的接口,不同的算法实现在 不同的实现类中

ConcreteStrategyA ,ConcreteStrategyB ,ConcreteStrategyC: 算法接口的不同实现

Context 类 :  对算法的引用类;


应用: 机器人案例


相关类:

IBehavior : 机器人行为的抽象

AgressiveBehavior :攻击行为的实现

DefensiveBehavior :防御行为的实现

NormalBehavior:通常行为的实现

Robot :机器人实例

Main : 主函数入口


IBehavior:

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/15.
 */
public interface IBehavior {

    public int command();

}

AggressiveBehavior :

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/15.
 */
public class AgressiveBehavior implements IBehavior {
    @Override
    public int command() {
        System.out.println("攻击他");
        return 1;
    }
}

DefensiveBehavior :

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/15.
 */
public class DefensiveBehavior implements IBehavior {
    @Override
    public int command() {
        System.out.println("远离他");
        return -1;
    }
}

NormalBehavior :

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/15.
 */
public class NormalBehavior implements IBehavior {
    @Override
    public int command() {
        System.out.println("无视他,径直走开");
        return 0;
    }
}

Robot:

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/15.
 */
public class Robot {

    private String name;

    private IBehavior behavior;

    public Robot() {
    }

    public Robot(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public IBehavior getBehavior() {
        return behavior;
    }

    public void setBehavior(IBehavior behavior) {
        this.behavior = behavior;
    }

    public void move() {
        System.out.print(this.name + " 在行走的过程中遇到了另一个机器人 →");
        behavior.command();
    }
}

Main:

package com.ycit.strategy;

/**
 * Created by xlch on 2017/3/16.
 */
public class Main {

    public static void main(String [] args) {
        Robot robot007 = new Robot("007");
        Robot robotG = new Robot("G");
        Robot robotR = new Robot("R");
        robot007.setBehavior(new AgressiveBehavior());
        robotG.setBehavior(new DefensiveBehavior());
        robotR.setBehavior(new NormalBehavior());
        robot007.move();
        robotG.move();
        robotR.move();
        robot007.setBehavior(new DefensiveBehavior());
        robot007.move();
    }

}

执行结果:

007 在行走的过程中遇到了另一个机器人 →攻击他
G 在行走的过程中遇到了另一个机器人 →远离他
R 在行走的过程中遇到了另一个机器人 →无视他,径直走开
007 在行走的过程中遇到了另一个机器人 →远离他




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值