Java23种常见设计模式 01策略者模式

策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

优点:

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点:

  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

何时使用:

一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:

将这些算法封装成一个一个的类,任意地替换。

注意事项:

如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

案例实现:

1. 案例说明

在一个射击游戏中,有不同种类的飞机,模拟飞机在使用不同道具时,他的外观会改变

2. 案例实现

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:09
 * Desc:飞机的主类
 */
abstract class Plain {
    /* 飞机的外观*/
    DisplayBehavior displayBehavior;

    public Plain() {
    }

    public void display() {
        displayBehavior.display();
    }

    public void setDisplayBehavior(DisplayBehavior displayBehavior) {
        this.displayBehavior = displayBehavior;
    }
}

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:26
 * Desc:外观接口
 */
interface DisplayBehavior {
    void display();
}

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:19
 * Desc:绿色外观
 */
class GreenBehavior implements DisplayBehavior {

    @Override
    public void display() {
        System.out.println("绿色的外观");
    }
}

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:20
 * Desc:红色外观
 */
class RedBehavitor implements DisplayBehavior {

    @Override
    public void display() {
        System.out.println("红色的外观");
    }
}


/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:17
 * Desc:绿飞机
 */
class GreenPlain extends Plain {

    public GreenPlain() {
        displayBehavior = new GreenBehavior();
    }
}

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:17
 * Desc:红飞机
 */
class RedPlain extends Plain {

    public RedPlain() {
        displayBehavior = new RedBehavitor();
    }
}

/**
 * Author:YANKAI
 * Date:2019/4/18
 * Time:15:28
 * Desc:飞机测试类
 */
public class StrategyPattern {
    public static void main(String[] args) {
        // 创建对象
        Plain greenPlain = new GreenPlain();
        Plain redPlain = new RedPlain();

        System.out.println("-------打印greenPlain的外观-------");
        // 输出绿色飞机的外观
        greenPlain.display();

        System.out.println("-------打印redPlain外观-------");
        // 输出红色飞机的外观
        redPlain.display();

        System.out.println("-------打印greenPlain修改后的外观-------");
        // 改变绿色飞机的外观
        greenPlain.setDisplayBehavior(new RedBehavitor());
        greenPlain.display();
    }
}

运行结果

在这里插入图片描述

参考文献

猜你喜欢

转载自blog.csdn.net/yankai1101/article/details/89423404