码迷,mamicode.com
首页 > 编程语言 > 详细

策略模式-Strategy(Java实现)

时间:2018-05-09 14:50:39      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:策略模式   攻击   rest   例子   func   system   cti   ati   运行   

策略模式-Strategy

在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, 选择其中一个来执行任务.

本文基本就是copy了一下Ilkka Seppälä(github里的iluwatar)的例子,  他的例子非常形象.

场景是这样的: 有一个屠龙勇士, 他会替换不同的装备(策略)来对抗不同的龙.

定义

DragonSlayingStrategy接口

策略模式有很多的策略, 在这里把屠龙策略抽象出来, 定义一下屠龙场景中的策略DragonSlayingStrategy接口.

/**
 * 屠龙策略接口
 */
@FunctionalInterface
public interface DragonSlayingStrategy {
    void execute();
}

DragonSlayer类

在这里定义了屠龙勇士DragonSlayer.

屠龙勇士有一个默认策略, 还可以进行替换策略的操作, 还可以使用当前的策略来进行攻击.

/**
 * 屠龙勇士
 */
public class DragonSlayer {
    /**
     * 屠龙策略
     */
    private DragonSlayingStrategy strategy;


    /**
     * 如果是空参构造器, 那么赋上一个默认的策略
     */
    public DragonSlayer() {
        strategy = new DragonSlayingStrategy() {
            @Override
            public void execute() {
                System.out.println("默认策略: 拳打脚踢");
            }
        };
    }

    /**
     * 传入一个策略, 根据这个策略来进行实例化屠龙勇士
     */
    public DragonSlayer(DragonSlayingStrategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 策略是可以随时变的, change一下就好了
     */
    public DragonSlayer changeStrategy(DragonSlayingStrategy strategy) {
        this.strategy = strategy;
        return this;
    }

    /**
     * 使用当前策略来执行屠龙
     */
    public void goToBattle() {
        this.strategy.execute();
    }
}

实现

基本的模型已经出来, 但是咱们还没有创建具体的策略类呢, 让我们来创建两个吧

SpellStrategy类

/**
 * 念魔咒策略
 */
public class SpellStrategy implements DragonSlayingStrategy{

    @Override
    public void execute() {
        System.out.println("魔咒策略: 念魔咒把龙封印掉");
    }
}

FireStrategy类

/**
 * 火器策略
 */
public class FireStrategy implements DragonSlayingStrategy {
    @Override
    public void execute() {
        System.out.println("火器策略: 用火烧");
    }
}

  

Main

这里是运行示例

public class Main {
    public static void main(String[] args) {
        // 有一个屠龙勇士
        DragonSlayer slayer = new DragonSlayer();

        System.out.println("\n幼龙出现啦");

        slayer.goToBattle();

        /*-************世界安静了片刻**************-*/

        System.out.println("\n冰龙出现啦!");

        //屠龙勇士发现可以用火克制他, 于是换了火器策略, 进行攻击
        slayer.changeStrategy(new FireStrategy()).goToBattle();

        /*-************世界安静了片刻**************-*/

        System.out.println("\n远古巨龙出现啦!");

        // 巨龙太强大了, 只能装备好念魔咒这个技能, 然后攻击
        slayer.changeStrategy(new SpellStrategy()).goToBattle();

        /*-************世界安静了片刻**************-*/

        System.out.println("\n魔龙出现啦");

        // 屠龙勇士用光了所有策略, 现场学会了一个新的技能, 还没来得及给这个技能起名字呢, 屠龙要紧, 快快快
        slayer.changeStrategy(new DragonSlayingStrategy() {
            @Override
            public void execute() {
                System.out.println("神秘技能: 顿悟出一套从天而降的掌法, 如来神掌!");
            }
        }).goToBattle();

        /*-************世界安静了片刻**************-*/
        System.out.println("\n神龙出现啦");

        // 屠龙勇士利用函数式编程发明了一种新的神级招式: 洗脑
        slayer.changeStrategy(()-> System.out.println("洗脑策略: 洗脑~~~~~~")).goToBattle();
    }
}

技术分享图片

 

策略模式-Strategy(Java实现)

标签:策略模式   攻击   rest   例子   func   system   cti   ati   运行   

原文地址:https://www.cnblogs.com/noKing/p/9013426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!