乐趣区

关于后端:策-略-模-式指-鼠-为-鸭

前言

大家好,我是 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 DuckNeck());
        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. 在代码中应用这个客户端类,传入不同的策略到构造方法中来实现不同的成果。

本文灵感起源:https://www.bilibili.com/video/BV1jm4y1q76g

最初的最初

心愿各位屏幕前的 靓仔靓女们 给个三连!你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!

咱们下期再见!

退出移动版