首页 > 其他分享 >策略设计模式(Strategy)

策略设计模式(Strategy)

时间:2023-12-30 10:39:09浏览次数:26  
标签:oldCost java 策略 Strategy cost 设计模式 public BigDecimal


策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。

 1.  示例程序

举一个收银的例子,普通用户打95折,会员打8折,超级会员打6折。

如果在一个函数里面去解决这些问题,那么增加会员类型和折扣变化的时候会导致代码臃肿,难以维护。

可以使用策略模式去解决这个问题。策略模式只适用管理一组同类型的算法,并且这些算法是完全互斥的情况。也就是说任何时候,多个策略中只有一个可以生效的那一种。

策略模式中出现的角色:

策略接口,Customer.java。

具体策略:CommonCustomer.java,SuperCustomer.java,VIPCustomer.java。

上下文类:Cashier.java。

策略设计模式(Strategy)_java

策略接口,Customer.java,源代码如下所示:

package strategy;

import java.math.BigDecimal;

public interface Customer {
    /**
     * 计算折扣后的花费
     * @param oldCost 原花费
     * @return 折扣后的花费
     */
    public BigDecimal cost(BigDecimal oldCost);
}

具体策略:CommonCustomer.java,SuperCustomer.java,VIPCustomer.java。

CommonCustomer.java:

package strategy;

import java.math.BigDecimal;

public class CommonCustomer implements Customer {
    @Override
    public BigDecimal cost(BigDecimal oldCost) {
        return oldCost.multiply(new BigDecimal(0.95));
    }
}

VIPCustomer.java:

package strategy;

import java.math.BigDecimal;

public class VIPCustomer implements Customer {
    @Override
    public BigDecimal cost(BigDecimal oldCost) {
        return oldCost.multiply(new BigDecimal(0.8));
    }
}

SuperCustomer.java :

package strategy;

import java.math.BigDecimal;

public class SuperCustomer implements Customer{
    @Override
    public BigDecimal cost(BigDecimal oldCost) {
        return oldCost.multiply(new BigDecimal(0.6));
    }
}

 上下文类:Cashier.java。 测试代码如下所示:

package strategy;

import java.math.BigDecimal;

/**
 * 收银员
 */
public class Cashier {
    private Customer customer;

    private BigDecimal cost(BigDecimal oldCost) {
        return customer.cost(oldCost);
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public static void main(String[] args) {
        Cashier cashier = new Cashier();
        CommonCustomer commonCustomer = new CommonCustomer();
        SuperCustomer superCustomer = new SuperCustomer();
        VIPCustomer vipCustomer = new VIPCustomer();
        BigDecimal bigDecimal = new BigDecimal(7.2);
        cashier.setCustomer(commonCustomer);
        System.out.println(cashier.cost(bigDecimal));
        cashier.setCustomer(vipCustomer);
        System.out.println(cashier.cost(bigDecimal));
        cashier.setCustomer(superCustomer);
        System.out.println(cashier.cost(bigDecimal));
    }
}

运行截图如下所示:

策略设计模式(Strategy)_java_02

 

 策略模式的优点:

  • 避免使用多重条件(if-else)语句。多重条件语句不易维护。
  • 对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
  • 可以把公共的代码移到父类(策略类)里面,从而避免代码重复。

策略模式的缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别(调用的难度增加),以便适时选择恰当的算法类。这种策略类的创建及选择其实也可以通过工厂模式来辅助进行。
  • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观(具体策略类的数量会很多)。可以通过使用享元模式在一定程度上减少对象的数量。

参考文献:

 

标签:oldCost,java,策略,Strategy,cost,设计模式,public,BigDecimal
From: https://blog.51cto.com/xuxiangyang/9038430

相关文章

  • 桥接设计模式 (Bridge)
    1.问题引出实现某件产品,某产品有多种品牌(brand)和类型(kind)。比较直观的一种实现方式,多重继承如下图所示,多重继承的两大缺点:会导致有过多的类(类的数量=品牌数量*类型数量);新增品牌则需要新增所有的类型类,新增类型则需要新增所有的品牌类,违反了单一职责原则(单一职责原则:对类来说的,即......
  • Dashboard给你最直观的策略执行报告
    汽车内的仪表盘对于驾驶员来说是非常重要的,在仪表盘里不仅可以显示剩余油量、水温、发动机转速、行车速度等运行状况,当车辆出现故障的时候还会有相应的提示,有助于驾驶员对整车情况的了解和做出响应。JamfPro提供了非常丰富全面的管理功能,作为一个管理者,你肯定也希望有一个仪表盘来......
  • 23.page object 设计模式
    目录 pageobject模式简介pageobject设计原则pageobject模式简介 马丁福勒个人博客selenium官网传统UI自动化的问题无法适应UI频繁变化无法清晰表达业务用例场景大量的样板代码driver/find/clickPOM模式的优势降低UI变......
  • 市场引领者:武汉灰京文化的全面推广策略塑造游戏产业新典范
    在竞争激烈的游戏产业中,武汉灰京文化不仅在游戏开发方面展现出色,而且在推广和市场营销方面也扮演着关键角色。通过巧妙利用多种渠道,包括社交媒体、线上线下活动等,他们成功将游戏产品推向市场的前沿,吸引了大量玩家。这种全面的市场推广策略使得他们的游戏作品得以广泛传播,为游戏厂商......
  • 策略模式和模版方法有什么区别
    策略模式(StrategyPattern)和模板方法模式(TemplateMethodPattern)是两种不同的设计模式,它们在实现上有一些明显的区别:目的和应用场景:策略模式:主要用于定义一系列的算法,将每个算法封装起来,并使它们可以互相替换。客户端可以选择不同的策略对象,以达到不同的行为。模板方法模......
  • js设计模式之工厂模式
    原型链实现letUserFactory=function(role){if(thisinstanceofUserFactory){lets=newthis[role]returns}else{returnnewUserFactory(role)}}UserFactory.prototype={SumperAdmin:function(){this.name="......
  • 策略梯度
    策略梯度呢,顾名思义,策略就是一个状态或者是action的分布,梯度就是我们的老朋友,梯度上升或者梯度下降。  就是说,J函数的自变量是西塔,然后对J求梯度,进而去更新西塔,比如说,J西塔,是一个该策略下预测状态值,也可以说是策略值,那么我们当然希望这个策略值越大越好,于是就要使用梯度上升......
  • 在线教育系统源码解读:定制化企业培训APP的开发策略
    当下,企业培训正经历着一场数字化的迭代,定制化企业培训APP应运而生,成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码,探讨开发定制化企业培训APP的策略,以满足不同企业的培训需求。 1.源码结构解析常见的在线教育系统可能包括用户管理、课......
  • 智安网络|实现安全与网络功能一体化:SASE的全新安全策略
    随着企业信息化和数字化程度的不断提升,网络安全面临着前所未有的挑战。传统的网络安全模式已经无法满足日益复杂的安全需求。在这一背景下,安全访问服务边缘(SASE)崭露头角,并逐渐成为新一代网络安全架构的关键概念。企业网络的规模扩大和云计算、物联网等技术的广泛应用,传统的网络安全......
  • 设计模式对比
     代理、桥接、装饰器、适配器4种设计模式的区别代理、桥接、装饰器、适配器,这4种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为Wrapper模式,也就是通过Wrapper类二次封装原始类。尽管代码结构相似,但这4种设计模式的用意完全不同,也就是说要......