23种设计模式——策略模式

简介: 策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
今天我们就来学习一下23种设计模式中的策略模式。如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
概念:

策略模式是定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

特点:

优点:

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

缺点:

  • 策略类会增多。
  • 所有策略类都需要对外暴露。
代码:

鸭子飞翔行为的接口

package cn.ppdxzz.strategy;

/**
 * description:鸭子飞翔行为的接口
 * @author: PeiChen JavaAnything
 */
public interface FlyBehavior {
    /**
     * 会飞的行为,子类具体实现
     */
    void fly();
}

飞翔技术好

package cn.ppdxzz.strategy;

/**
 * description:飞翔技术好
 * @author: PeiChen JavaAnything
 */
public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞翔技术高超...");
    }
}

飞翔技术一般

package cn.ppdxzz.strategy;

/**
 * description:飞翔技术一般
 * @author: PeiChen JavaAnything
 */
public class BadFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞翔技术一般...");
    }
}

不会飞翔

package cn.ppdxzz.strategy;

/**
 * description:不会飞翔
 * @author: PeiChen JavaAnything
 */
public class NoFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("不会飞翔...");
    }
}

嘎嘎叫的行为

package cn.ppdxzz.strategy;

/**
 * description:嘎嘎叫的行为
 * @author: PeiChen JavaAnything
 */
public interface QuackBehavior {
    /**
     * 嘎嘎叫
     */
    void quack();
}

抽象鸭子类

package cn.ppdxzz.strategy;

/**
 * description:抽象鸭子类
 * @author: PeiChen JavaAnything
 */
public abstract class Duck {
    /**
     * 属性,策略接口
     */
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    /**
     * 显示鸭子信息
     */
    public abstract void display();
    public void quack() {
        System.out.println("鸭子嘎嘎叫...");
    }
    public void swim() {
        System.out.println("鸭子会游泳...");
    }
    public void fly() {
        //改进方法
        if (flyBehavior != null) {
            flyBehavior.fly();
        }
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

北京鸭

package cn.ppdxzz.strategy;

/**
 * description:北京鸭
 * @author: PeiChen JavaAnything
 */
public class PekingDuck extends Duck {
    public PekingDuck() {
        //飞翔技术一般的北京鸭
        flyBehavior = new BadFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("---北京鸭---");
    }
}

玩具鸭

package cn.ppdxzz.strategy;

/**
 * description:玩具鸭
 * @author: PeiChen JavaAnything
 */
public class ToyDuck extends Duck {
    public ToyDuck() {
        //不会飞的玩具鸭
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("---玩具鸭---");
    }

    @Override
    public void quack() {
        System.out.println("玩具鸭不会叫...");
    }

    @Override
    public void swim() {
        System.out.println("玩具鸭不会游泳...");
    }
}

野鸭

package cn.ppdxzz.strategy;

/**
 * description:野鸭
 * @author: PeiChen JavaAnything
 */
public class WildDuck extends Duck {
    public WildDuck() {
        //飞翔技术好的野鸭
        flyBehavior = new GoodFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("---野鸭---");
    }
}

策略模式客户端

package cn.ppdxzz.strategy;

/**
 * description:策略模式客户端
 * @author: PeiChen JavaAnything
 */
public class Client {
    public static void main(String[] args) {
        System.out.print("北京鸭:");
        PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.fly();
        System.out.print("玩具鸭:");
        ToyDuck toyDuck = new ToyDuck();
        toyDuck.fly();
        System.out.print("野鸭:");
        WildDuck wildDuck = new WildDuck();
        wildDuck.fly();
        System.out.print("更改飞行能力的北京鸭:");
        //动态的更改北京鸭的飞行状态
        pekingDuck.setFlyBehavior(new NoFlyBehavior());
        pekingDuck.fly();
    }
}

运行结果:

策略模式运行结果.png

总结:
  • 策略模式的核心思想是多用组合/聚合少用继承,用行为类组合,而不是行为的继承。
  • 策略模式需要注意的是每添加一个策略就要增加一个类,当策略过多时会导致类的数目庞大。
目录
相关文章
|
4月前
|
设计模式 算法
设计模式之 Strategy(策略模式)
设计模式之 Strategy(策略模式)
45 1
|
4月前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
32 0
|
3月前
|
设计模式 算法
策略模式-大话设计模式
策略模式-大话设计模式
|
4月前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
65 1
|
13天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
30 2
|
16天前
|
设计模式 算法 开发者
深入理解工厂模式与策略模式:设计模式的灵活应用
深入理解工厂模式与策略模式:设计模式的灵活应用
|
1月前
|
设计模式 算法 C#
C#设计模式之策略模式
C#设计模式之策略模式
72 19
|
24天前
|
设计模式 算法 Java
【十六】设计模式~~~行为型模式~~~策略模式(Java)
文章详细介绍了策略模式(Strategy Pattern),这是一种对象行为型模式,用于定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了系统的灵活性和可扩展性。通过电影院售票系统中不同类型用户的打折策略案例,展示了策略模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和测试结果。
【十六】设计模式~~~行为型模式~~~策略模式(Java)
|
4月前
|
设计模式 算法 Java
小谈设计模式(3)—策略模式
小谈设计模式(3)—策略模式
|
1月前
|
设计模式 算法 测试技术
[设计模式]行为型模式-策略模式
[设计模式]行为型模式-策略模式