【无标题】JAVA策略模式代码例子

news/2024/12/2 23:16:18/

在Java中,您可以使用面向对象编程中的继承和多态性来实现您的需求。首先,我们定义一个`Good`类,该类包含满减策略和打折策略。然后,我们可以让`Shoe`类和`Cloth`类继承自`Good`类。为了实现不同的折扣或满减策略,可以考虑使用策略模式

 

下面是一个简单的实现示例:

 

### 1. 定义策略接口

 

首先,我们需要定义一个策略接口,该接口可以被不同的具体策略实现。

 

```java

public interface DiscountStrategy {

    double applyDiscount(double originalPrice);

}

```

 

### 2. 实现具体的策略

 

接下来,我们实现几个具体的策略,例如满减和打折。

 

```java

public class FullReductionStrategy implements DiscountStrategy {

    private double threshold;

    private double reduction;

 

    public FullReductionStrategy(double threshold, double reduction) {

        this.threshold = threshold;

        this.reduction = reduction;

    }

 

    @Override

    public double applyDiscount(double originalPrice) {

        return originalPrice >= threshold ? originalPrice - reduction : originalPrice;

    }

}

 

public class PercentageDiscountStrategy implements DiscountStrategy {

    private double discountRate;

 

    public PercentageDiscountStrategy(double discountRate) {

        this.discountRate = discountRate;

    }

 

    @Override

    public double applyDiscount(double originalPrice) {

        return originalPrice * (1 - discountRate);

    }

}

```

 

### 3. 定义商品基类

 

现在,我们定义`Good`类,并给它添加一个`DiscountStrategy`类型的字段,以及应用折扣的方法。

 

```java

public abstract class Good {

    protected String name;

    protected double price;

    protected DiscountStrategy discountStrategy;

 

    public Good(String name, double price, DiscountStrategy discountStrategy) {

        this.name = name;

        this.price = price;

        this.discountStrategy = discountStrategy;

    }

 

    public double getPriceAfterDiscount() {

        return discountStrategy.applyDiscount(price);

    }

 

    // Getters and Setters

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public double getPrice() {

        return price;

    }

 

    public void setPrice(double price) {

        this.price = price;

    }

 

    public DiscountStrategy getDiscountStrategy() {

        return discountStrategy;

    }

 

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {

        this.discountStrategy = discountStrategy;

    }

}

```

 

### 4. 创建子类

 

最后,创建`Shoe`和`Cloth`类,它们都继承自`Good`类。

 

```java

public class Shoe extends Good {

    public Shoe(String name, double price, DiscountStrategy discountStrategy) {

        super(name, price, discountStrategy);

    }

}

 

public class Cloth extends Good {

    public Cloth(String name, double price, DiscountStrategy discountStrategy) {

        super(name, price, discountStrategy);

    }

}

```

 

### 5. 使用示例

 

下面是如何使用这些类的一个简单示例:

 

```java

public class Main {

    public static void main(String[] args) {

        DiscountStrategy shoeDiscount = new PercentageDiscountStrategy(0.1); // 10% off

        DiscountStrategy clothDiscount = new FullReductionStrategy(100, 20); // 满100减20

 

        Shoe shoe = new Shoe("Running Shoe", 150, shoeDiscount);

        Cloth cloth = new Cloth("T-shirt", 80, clothDiscount);

 

        System.out.println("Shoe Price After Discount: " + shoe.getPriceAfterDiscount());

        System.out.println("Cloth Price After Discount: " + cloth.getPriceAfterDiscount());

    }

}

```

 

这段代码展示了如何通过策略模式灵活地为不同种类的商品设置不同的折扣策略。希望这能帮助您解决问题!如果有任何其他问题或需要进一步的帮助,请随时告诉我。


http://www.ppmy.cn/news/1551870.html

相关文章

网络安全入门的16个基本问题

问:什么是网络安全? 答:网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,系统可以连续可靠正常地运行,网络服务不被中断。 问:什…

windows C#-迭代器(下)

对泛型列表使用迭代器 在以下示例中&#xff0c;Stack<T> 泛型类实现 IEnumerable<T> 泛型接口。 Push 方法将值分配给类型为 T 的数组。 GetEnumerator 方法通过使用 yield return 语句返回数组值。 除了泛型 GetEnumerator 方法&#xff0c;还必须实现非泛型 G…

【ETCD】etcd中配置参数详解

详细记录etcd服务启动的各个参数 1、etcd成员相关的配置项 --name default 为该成员指定一个易读的名称。--data-dir ${name}.etcd 数据存储目录的路径。--wal-dir 用于存放专用WAL&#xff08;Write-Ahead Log&#xff09;的目录路径。--snapshot-count 100000 触发快照…

R 因子

R 因子 引言 在金融领域&#xff0c;风险管理和投资策略的优化一直是核心议题。传统的风险度量工具&#xff0c;如波动率、Beta系数等&#xff0c;虽然在一定程度上能够帮助投资者理解市场的波动和资产的相对风险&#xff0c;但它们往往无法全面捕捉到市场动态的复杂性。因此…

3.27【机器学习】第五章作业代码实现

5.1 使用线性函数作为激活函数时&#xff0c;因为在单元层和隐藏层&#xff0c;其单元值仍是输入值X的线性组合&#xff0c;只能表示线性关系&#xff0c;无法表示非线性关系。神经网络的优势在于能够学习和表示复杂的非线性关系。如果使用线性激活函数&#xff0c;神经网络只…

小红书矩阵运营:怎么通过多个账号来提升品牌曝光?

在如今的社交媒体环境中&#xff0c;小红书作为一个以分享生活方式、购物心得为主的平台&#xff0c;已经成为品牌营销的热土。尤其是通过“小红书矩阵”&#xff0c;品牌能够精准触达不同的用户群体&#xff0c;提升曝光度和转化率。那么&#xff0c;如何通过多个账号进行矩阵…

Uniapp 微信小程序内打开web网页

技术栈&#xff1a;Uniapp Vue3 简介 实际业务中有时候会需要在本微信小程序内打开web页面&#xff0c;这时候可以封装一个路由页面专门用于此场景。 在路由跳转的时候携带路由参数&#xff0c;拼接上web url&#xff0c;接收页面进行参数接收即可。 实现 webview页面 新…

vitess使用记录:vtctldclient,设置分表规则

继续探索未完成的事情。 vitess使用记录系列已经写了好几篇了&#xff0c;记录了在测试过程中遇到的各种问题。《vitess使用&#xff1a;从部署到go客户端连接查询》、《vitess使用记录&#xff1a;vtctldclient》、《vitess使用&#xff1a;基于源码运行vtctldclient工具》整…