Java设计模式之java策略模式详解

Java设计模式之Java策略模式详解

什么是Java策略模式?

Java策略模式是一种行为型设计模式,它定义了算法族,即一组具有相同目的和不同实现的算法,让它们之间可以相互替换。这个模式让算法的变化独立于使用算法的客户端,从而实现算法行为的变化而无需更改使用算法的客户端。

Java策略模式的三个角色

Java策略模式一般涉及到如下三个角色:

  1. Context 上下文对象:持有一个Strategy对象,并在其内部的某个方法中调用该对象的方法实现具体的算法行为。
  2. Strategy 策略接口:封装具体的算法实现,提供一个执行算法的方法进行调用。
  3. Concrete Strategy 具体策略:实现策略接口,定义具体的算法实现方法。

Java策略模式的优点

  1. 策略模式可避免使用多重条件语句(if...else语句)。
  2. 策略模式为算法实现提供了更具优化的更换方案,增强系统的灵活性和维护性。
  3. 策略模式将一系列的算法封装成类独立于客户端进行独立修改和扩展。

Java策略模式的示例

下面举两个简单的Java策略模式的示例:

示例一:鸭子游戏

假设我们有一个鸭子游戏,游戏里有多种不同类型的鸭子,它们需要实现三个行为:游泳、飞行和叫声。

// 鸭子抽象类
public abstract class Duck {
    SwimBehavior swimBehavior;
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public void setSwimBehavior(SwimBehavior sb) {
        swimBehavior = sb;
    }

    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }

    public void swim() {
        swimBehavior.swim();
    }

    public void fly() {
        flyBehavior.fly();
    }

    public void quack() {
        quackBehavior.quack();
    }

    public abstract void display();
}

// 游泳行为接口
public interface SwimBehavior {
    void swim();
}

// 飞行行为接口
public interface FlyBehavior {
    void fly();
}

// 叫声行为接口
public interface QuackBehavior {
    void quack();
}

具体的鸭子类型分别实现抽象类Duck,并设置各自的游泳、飞行和叫声行为:

// 绿头鸭
public class MallarDuck extends Duck {
    public MallarDuck() {
        swimBehavior = new SwimWithSLippers();
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("MallarDuck");
    }
}

// 红头鸭
public class RedheadDuck extends Duck {
    public RedheadDuck() {
        swimBehavior = new SwimWithOutSLippers();
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("RedheadDuck");
    }
}

// 橡皮鸭
public class RubberDuck extends Duck {
    public RubberDuck() {
        swimBehavior = new SwimWithOutSLippers();
        flyBehavior = new NoFly();
        quackBehavior = new Squeak();
    }

    @Override
    public void display() {
        System.out.println("RubberDuck");
    }
}

// 诱饵鸭
public class DecoyDuck extends Duck {
    public DecoyDuck() {
        swimBehavior = new SwimWithOutSLippers();
        flyBehavior = new NoFly();
        quackBehavior = new MuteQuack();
    }

    @Override
    public void display() {
        System.out.println("DecoyDuck");
    }
}

游戏中不同的鸭子类型,根据其具体的行为进行配置:

public class DuckGame {
    public static void main(String[] args) {
        Duck mallarDuck = new MallarDuck();
        mallarDuck.swim();
        mallarDuck.fly();
        mallarDuck.quack();

        Duck rubberDuck = new RubberDuck();
        rubberDuck.swim();
        rubberDuck.fly();   // 诱饵鸭和橡皮鸭不能飞行,因此具体的策略实现为NoFly;
        rubberDuck.quack();
    }
}

在上述示例中,游戏中不同的鸭子类型根据具体的行为进行配置,并能够根据需要动态的配置每个鸭子的具体实现。

示例二:商城商品打折

假设我们有一个商城系统,对于不同价格区间的商品,需要根据具体的折扣策略进行优惠。

// 商品抽象类
public abstract class Goods {
    // 获取商品的价格
    public abstract double getPrice();

    // 获取打折后的价格
    public abstract double getDiscountPrice(DiscountStrategy discountStrategy);
}

// 折扣策略接口
public interface DiscountStrategy {
    double discount(double price);
}

// 新手客户策略
public class NewCustomerDiscount implements DiscountStrategy {
    @Override
    public double discount(double price) {
        System.out.println("新手客户打9折!");
        return price * 0.9;
    }
}

// 老客户策略
public class OldCustomerDiscount implements DiscountStrategy {
    @Override
    public double discount(double price) {
        System.out.println("老客户打8折!");
        return price * 0.8;
    }
}

// VIP客户策略
public class VIPCustomerDiscount implements DiscountStrategy {
    @Override
    public double discount(double price) {
        System.out.println("VIP客户打7折!");
        return price * 0.7;
    }
}

// 具体的商品实现类
public class GoodsImpl extends Goods {
    private double price;

    public GoodsImpl(double price) {
        this.price = price;
    }

    @Override
    public double getPrice() {
        return price;
    }

    @Override
    public double getDiscountPrice(DiscountStrategy discountStrategy) {
        return discountStrategy.discount(price);
    }
}

不同价格区间的商品根据打折策略进行打折,商城系统实现如下:

public class DiscountGame {
    public static void main(String[] args) {
        Goods goods1 = new GoodsImpl(100.0);
        double discountPrice1 = goods1.getDiscountPrice(new NewCustomerDiscount());
        System.out.println("物品1的打折后价格:" + discountPrice1);

        Goods goods2 = new GoodsImpl(500.0);
        double discountPrice2 = goods2.getDiscountPrice(new OldCustomerDiscount());
        System.out.println("物品2的打折后价格:" + discountPrice2);

        Goods goods3 = new GoodsImpl(1000.0);
        double discountPrice3 = goods3.getDiscountPrice(new VIPCustomerDiscount());
        System.out.println("物品3的打折后价格:" + discountPrice3);
    }
}

在上述示例中,不同价格区间的商品根据打折策略进行打折,商城系统具有完善的策略规定,并能够根据需要动态的配置不同的打折策略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之java策略模式详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Springboot项目异常处理及返回结果统一

    下面是关于Spring Boot项目异常处理及返回结果统一的完整攻略: 1. 异常处理的重要性 在Web开发中,异常是常见的问题。除开系统自带的异常外,还有业务系统自己抛出的异常。如果不及时有效的处理异常,系统将会毫无提示地将异常信息直接暴露给用户,这对系统的安全性以及可维护性均会产生不利影响。 因此,良好的异常处理机制非常重要。Spring Boot为我们…

    Java 2023年5月27日
    00
  • Java Exception 捕获和显示实例详解

    Java Exception 捕获和显示实例详解 什么是异常(Exception)? 在编写 Java 程序时,异常是不可避免的。异常是程序在运行时发生的错误或问题。 在 Java 中,异常被视为对象,这是由类派生的异常类的实例。 如果在运行程序时发生异常,程序会被终止。 Java 异常的类层次结构 在 Java 中,异常的类层次结构如下所示: java.l…

    Java 2023年5月26日
    00
  • slf4j使用log4j的配置参数方式

    slf4j是一个Java日志框架的抽象层,它可以与多种具体的日志框架进行绑定。log4j是其中一种在Java程序中常见的日志框架,可以与slf4j进行绑定。通过使用slf4j和log4j,可以在代码中进行方便的日志记录和管理。 以下是使用log4j作为实际日志框架的示例: 添加依赖 首先需要在项目的pom文件中添加slf4j和log4j的依赖。 <de…

    Java 2023年5月20日
    00
  • Java之JsonArray用法讲解

    Java之JsonArray用法讲解 在Java中,经常需要使用Json格式的数据结构进行数据传递和交换。JsonArray是Json中的一个数据类型,本文将讲解JsonArray的用法。 JsonArray是什么? JsonArray是一个有序集合,其中包含了一系列的JsonElement。JsonElement是Json中的基本数据类型,可以是JsonA…

    Java 2023年5月26日
    00
  • java如何利用poi解析doc和docx中的数据

    当需要从 Word 文档中提取数据的时候,我们可以使用 Apache POI 来读取 “.doc” 和 “.docx” 文件。下面是如何利用 POI 解析 Word 文档中数据的攻略: 1. 添加 POI 依赖 在项目中添加以下依赖: <dependency> <groupId>org.apache.poi</groupId&g…

    Java 2023年5月20日
    00
  • 简单了解Spring Boot及idea整合jsp过程解析

    下面我来详细讲解一下“简单了解SpringBoot及idea整合jsp过程解析”的完整攻略。 什么是SpringBoot? SpringBoot 是一个基于 Spring 框架的全新框架,旨在简化 Spring 应用程序的创建和开发过程,它采用约定大于配置的原则,自动配置 Spring 和第三方库,提供了一组默认的 Starter 依赖项,可以快速搭建起基于…

    Java 2023年5月15日
    00
  • java开发AOP面向切面编程入门

    Java AOP面向切面编程入门攻略 什么是AOP编程 AOP(AspectOriented Programming),即面向切面编程,是OOP编程模式的一种补充。AOP编程是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 在传统的OOP编程中,我们将所有重复出现的代码封装到相应的模块或类中,实现代码复用。通过继承或组合等方式,可以将这些…

    Java 2023年5月19日
    00
  • Spring Security实现接口放通的方法详解

    接下来我将为您详细讲解“Spring Security实现接口放通的方法详解”的完整攻略,并提供两个示例。 1. Spring Security简介 Spring Security是一个基于Spring框架的安全控制框架,主要用于身份验证和授权。它提供了一组完整的认证和授权机制,可以帮助我们快速地构建安全性较高的Web系统。Spring Security提供…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部