设计模式 - 策略模式

Posted mr-wenyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 - 策略模式相关的知识,希望对你有一定的参考价值。

策略模式的定义:

  对象有某个行为,但在不同的场景中,该行为有不同的实现算法

模拟鸭子题目:

  设计一个鸭子游戏,游戏中会出现各种鸭子,鸭子类型有木头鸭(不会飞,不会叫)、模型鸭(不会叫,动力飞)、绿头鸭(会飞、会叫)

 

coding:

技术分享图片
package Strategy;

public interface FlyBehavior {
    public void fly();
}
FlyBehavior

飞的行为(也叫策略),设计为一个接口(也叫抽象策略)。

鸭子的飞的方式有很多种,所有飞的方式都继承这个接口(抽象策略),所有的飞行方式组成一个族(算法族)

技术分享图片
package Strategy;

public class FlyNoWay implements FlyBehavior{

    public void fly() {
        System.out.println("我不会飞 !");
    }
}
FlyNoWay

不会飞,飞行算法族中的一个方式

技术分享图片
package Strategy;

public class FlyRocketPowered implements FlyBehavior{

    public void fly() {
        System.out.println("我用动力飞 !");
    }
}
FlyRocketPowered

用动力飞,飞行算法族中的一个方式

技术分享图片
package Strategy;

public class FlyWithWings implements FlyBehavior{

    public void fly() {
        System.out.println("我用翅膀飞 !");
    }
}
FlyWithWings

用翅膀飞,飞行算法族中的一个方式

 

技术分享图片
package Strategy;

public interface HueBehavior {
    public void hue();
}
HueBehavior

鸭子的颜色有好多种,所有的颜色都继承这个接口(抽象策略)

技术分享图片
package Strategy;

public class Black implements HueBehavior{

    public void hue() {
        System.out.println("我是黑色的 !");
    }
}
Black

黑色,是颜色算法族中的一个方式

技术分享图片
package Strategy;

public class White implements HueBehavior{

    public void hue() {
        System.out.println("我是白色的 !");
    }
}
White

白色,是颜色算法族中的一个方式

 

技术分享图片
package Strategy;

public interface QuackBehavior {
    public void quack();
}
QuackBehavior

鸭子的叫声有好多种,所有的叫声都继承这个接口(抽象策略)

技术分享图片
package Strategy;

public class Quiet implements QuackBehavior {

    public void quack() {
        System.out.println("我不会叫 !");
    }
}
Quiet

不叫,是叫声族中的一个方式

技术分享图片
package Strategy;

public class Quack implements QuackBehavior{

    public void quack() {
        System.out.println("我嘎嘎叫 !");
    }
}
Quack

嘎嘎叫,叫声族中的一个方式

技术分享图片
package Strategy;

public class Squeak implements QuackBehavior{

    public void quack() {
        System.out.println("我吱吱叫 !");
    }
}
Squeak

吱吱叫,叫声族中的一个方式

 

技术分享图片
package Strategy;

public class ModeDuck extends Duck{

    public ModeDuck() {
       flyBehavior = new FlyNoWay();
       quackBehavior = new Quiet();
       hueBehavior = new White();
    }
}
ModeDuck

模型鸭,也可以实现其他的鸭子(绿头鸭、木头鸭。。。)

 

技术分享图片
package com.company;

import Strategy.Duck;
import Strategy.ModeDuck;

public class Main {

    public static void main(String[] args) {

        Duck modelduck = new ModeDuck();
        modelduck.display();

    }
}
Main

跑一下!!!

 

鸭子的行为有很多种(颜色、飞行方式、叫声。。。),每一种行为都是可以抽象出一个抽象策略类,每一个行为又有多个实现方式,所有的实现都可以继承这个抽象策略类,实现成具体策略类。

这样以后扩展其他类型的鸭子的时候只要传不同的具体策略就可以实现了。

 

以上是关于设计模式 - 策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

设计模式策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式