前语

大家好,我是 god23bin,今天我们来介绍下规划形式中的一个重要的规划形式——战略形式

当涉及到某个行为或算法有多个变体时,战略形式是一种常见的规划形式。它答应在运转时挑选运用不同的战略,而无需修改现有代码。

现在就运用规划形式中经常出现的鸭子模型来介绍吧!

鸭子模型

策 略 模 式「指 鼠 为 鸭」

鸭子模型也是很好理解的,走路像鸭子,会像鸭子相同游水,还会叫出相似嘎嘎嘎的声音的东西,便是鸭子模型,至于它是不是鸭子,这不重要!

策 略 模 式「指 鼠 为 鸭」

战略形式

界说一系列的算法,把它们一个个封装起来,并且使它们可彼此替换。

主要处理在有多种算法相似的情况下,运用 if…else 所带来的复杂和难以维护的问题。

在大学食堂中,有许多的菜品,那么我们规划一个食物 Food 接口来表明各种菜品,该接口需要具有一个可以展现各种食物是什么的才能,就规划成一个 show 办法吧。

public interface Food {
    void show();
}

每种食物菜品都可以展现,那么我们界说一个鸭脖战略类 DuckNeckStrategy,作为一个食物菜品的战略。这个类完成 Food 接口,重写了 show 办法,可以展现这是一道正儿八经的鸭脖。

public class DuckNeckStrategy implements Food {
    @Override
    public void show() {
        System.out.println("嘎嘎嘎,我是正儿八经的鸭脖。");
    }
}

接着,我们写一个食物战略类,该战略类也完成 Food 接口,并将食物 Food 接口作为该类的特点进行声明,这种称为组合。一起写一个带 Food 接口参数的结构办法。

public class FoodStrategy implements Food {
    private Food food;
    public FoodStrategy(Food food) {
        this.food = food;
    }
    @Override
    public void show() {
        food.show();
    }
}

现在,我们用餐的同学进场了,写一个 Student 类,界说一个吃正儿八经鸭脖的办法。

public class Student {
    // 吃正儿八经的鸭脖
    public void eatDuckNeck() {
        Food duckNeck = new FoodStrategy(new DuckNeckStrategy());
        System.out.println("开吃!");
        duckNeck.show();
    }
}

现在我们运转下程序:

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.eatDuckNeck();
    }
}

输出:

开吃!
嘎嘎嘎,我是正儿八经的鸭脖。

现在我们界说一个老鼠头战略类 MouseHeadStrategy,作为一道菜品战略,自然也是需要完成 Food 接口,重写了 show 办法,可以完成展现鼠头鸭脖这道菜品。

public class MouseHeadStrategy implements Food {
    @Override
    public void show() {
        System.out.println("吱吱吱,我是长得像鼠头的鸭脖。");
    }
}

接着,给我们的同学加餐,多界说一个无奈吃鸭脖的办法,将一个老鼠头战略作为加餐的参数传递到办法中。

public class Student {
    // 吃正儿八经的鸭脖
    public void eatDuckNeck() {
        Food duckNeck = new FoodStrategy(new DuckNeckStrategy());
        System.out.println("开吃!");
        duckNeck.show();
    }
    // 吱吱吱,吃鸭脖
    public void eatDuckNeck(MouseHeadStrategy mouseHeadStrategy) {
        Food duckNeck = new FoodStrategy(mouseHeadStrategy);
        System.out.println("开吃!");
        duckNeck.show();
    }
}

现在,给 eatDuckNeck 办法传入一个老鼠头参数,我们继续运转下程序。

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        // 指鼠为鸭
        student.eatDuckNeck(new MouseHeadStrategy());
    }
}

输出:

开吃!
吱吱吱,我是长得像鼠头的鸭脖。

很明显,程序依旧可以履行,即便将鼠头传入,也能成为鸭脖。这便是战略形式给我们带来的好处,它答应我们在程序运转时去挑选不同的算法或战略来完成某种功能,而无需改动已有的代码结构。提高了我们代码的灵活性。

在这个例子中,战略形式可以在运转时经过战略来决定说你吃的是什么,想怎样就怎样,想让你是鸭脖便是鸭脖,即便你是老鼠头。

策 略 模 式「指 鼠 为 鸭」

总结

战略形式的写法:

  1. 界说一起的接口或抽象类来声明战略类都要完成的办法,就比方这儿的 show 办法。
  2. 界说具体的战略类,比方这儿的 DuckNeckStrategyMouseHeadStrategy,完成接口中的办法,每个具体战略类供给不同的算法或行为完成。
  3. 界说客户端类,比方这儿的 FoodStrategy,持有一个之前界说接口或抽象类的引证,这儿也便是所谓的组合,一起完成接口,完成一个结构办法,用来运用不同的战略来履行重写的接口办法。
  4. 在代码中运用这个客户端类,传入不同的战略到结构办法中来完成不同的效果。

本文灵感来源:www.bilibili.com/video/BV1jm…

最终的最终

希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里国际增加一颗明亮而耀眼的星!

我们下期再见!