广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入了解Java行为型设计模式之策略模式
  • 555
分享到

深入了解Java行为型设计模式之策略模式

2024-04-02 19:04:59 555人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录策略模式应用场景优缺点主要角色策略模式的基本使用创建抽象策略角色创建具体策略角色创建上下文角色客户端执行策略模式实现支付方式的选择创建抽象策略角色创建具体策略角色创建上下文角色客

策略模式

策略模式(Strategy Pattern)也叫政策模式(Policy Pattern),属于行为型模式。

它是将定义的一系列算法、分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。

策略模式能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

应用场景

1、针对同一类型问题,有多种处理方式,每一种都能独立解决问题。

2、算法需要自由切换的场景。

3、需要屏蔽算法规则的场景。

优缺点

优点:

1.可以在运行时切换对象内的算法。

2.避免使用多重条件转移语句,如if.else.语句、switch语句

3.使用策略模式可以提高算法的保密性和安全性。

4.可以将算法的实现和使用算法的代码隔离开来。

缺点:

1.客户端必须知道所有的策略,所有策略类都需要对外暴露,并且自行决定使用哪一个策略类。

2.代码中会产生非常多策略类,增加维护难度。

主要角色

1.抽象策略角色(Strategy)

规定策略或算法的行为。

2.具体策略角色(ConcreteStrategy)

具体的策略或算法实现。

3.上下文角色(Context)

用来操作策略的上下文环境,屏蔽高层模块(客户瑞)对策略,算法的直接访问,封装可能存在的变化。

策略模式的基本使用

创建抽象策略角色

public interface IStrategy {
    
    void alGorithm();
}

创建具体策略角色

public class ConcreteStrategyA implements IStrategy {
    public void algorithm() {
        System.out.println("Strategy A 打9折");
    }
}
public class ConcreteStrategyB implements IStrategy {
    public void algorithm() {
        System.out.println("Strategy B 打8折");
    }
}

创建上下文角色

public class Context {
    private IStrategy mStrategy;
    public Context(IStrategy strategy) {
        this.mStrategy = strategy;
    }
    public void algorithm() {
        this.mStrategy.algorithm();
    }
}

客户端执行

    public static void main(String[] args) {
        // 创建具体策略
        IStrategy strategyA = new ConcreteStrategyA();
        IStrategy strategyB = new ConcreteStrategyB();
        // 创建上下文环境
        Context contextA = new Context(strategyA);
        Context contextB = new Context(strategyB);
        //客户端直接让上下文环境执行算法
        contextA.algorithm();
        contextB.algorithm();
    }

Strategy A 打9折
Strategy B 打8折

策略模式实现支付方式的选择

创建抽象策略角色

创建支付抽象类,定义支付逻辑

public abstract class Payment {
    
    public abstract String getName();
    
    public String pay(String uid, double amount){
        if(queryBalance(uid) < amount){
            return "支付失败,"+"商品金额:"+amount+" ,用户余额:"+queryBalance(uid);
        }
        return "支付成功,"+"商品金额:"+amount+" ,用户余额:"+(queryBalance(uid)-amount);
    }
    
    protected abstract double queryBalance(String uid);
}

创建具体策略角色

创建具体支付方式,如AliPay 、WechatPay 、UNIOnPay等三种方式。

public class AliPay extends Payment {
    public String getName() {
        return "支付宝";
    }
    protected double queryBalance(String uid) {
        return 500;
    }
}
public class WechatPay extends Payment {
    public String getName() {
        return "微信支付";
    }
    protected double queryBalance(String uid) {
        return 600;
    }
}
public class UnionPay extends Payment {
    public String getName() {
        return "银联支付";
    }
    protected double queryBalance(String uid) {
        return 800;
    }
}

创建上下文角色

创建上下文角色,

public class PayStrategy {
    public static final String ALI_PAY = "AliPay";
    public static final String WECHAT_PAY = "WechatPay";
    public static final String UNION_PAY = "UnionPay";
    public static final String DEFAULT_PAY = ALI_PAY;
    private static Map<String, Payment> strategy = new HashMap<String, Payment>();
    static {
        strategy.put(ALI_PAY, new AliPay());
        strategy.put(WECHAT_PAY, new WechatPay());
        strategy.put(UNION_PAY, new UnionPay());
    }
    public static Payment get(String payKey) {
        if (!strategy.containsKey(payKey)) {
            return strategy.get(DEFAULT_PAY);
        }
        return strategy.get(payKey);
    }
}

客户端执行

public class Order {
    private String uid;
    private String name;
    private double price;
    public Order(String uid, String name, double price) {
        this.uid = uid;
        this.name = name;
        this.price = price;
    }
    public String pay() {
        return pay(PayStrategy.DEFAULT_PAY);
    }
    public String pay(String payKey) {
        Payment payment = PayStrategy.get(payKey);
        System.out.println("购买:"+name+" ,使用" + payment.getName() + "支付, " + "支付金额为: " + price);
        return payment.pay(uid, price);
    }
}
    public static void main(String[] args) {
        Order order = new Order("001","皮皮虾",500.5);
        System.out.println(order.pay());
        System.out.println("----------------------------------------------------");
        System.out.println(order.pay(PayStrategy.WECHAT_PAY));
    }

购买:皮皮虾 ,使用支付宝支付, 支付金额为: 500.5
支付失败,商品金额:500.5 ,用户余额:500.0
----------------------------------------------------
购买:皮皮虾 ,使用微信支付支付, 支付金额为: 500.5
支付成功,商品金额:500.5 ,用户余额:99.5

到此这篇关于深入了解Java行为型设计模式之策略模式的文章就介绍到这了,更多相关Java策略模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入了解Java行为型设计模式之策略模式

本文链接: https://www.lsjlt.com/news/168098.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入了解Java行为型设计模式之策略模式
    目录策略模式应用场景优缺点主要角色策略模式的基本使用创建抽象策略角色创建具体策略角色创建上下文角色客户端执行策略模式实现支付方式的选择创建抽象策略角色创建具体策略角色创建上下文角色客...
    99+
    2022-11-13
  • 深入了解Java设计模式之策略模式
    目录定义解决的问题核心要点类图溢出效用代码实现核心接口实现类-三个Context类Main方法拓展JDK源码Spring源码定义 定义了算法家族,分别封装起来,让他们之间可以相互替换...
    99+
    2022-11-13
  • 深入理解Java设计模式之策略模式
    目录一、什么是策略模式二、策略模式的结构三、策略模式的应用场景四、策略模式的优缺点六、策略模式的实现七、策略模式和简单工厂模式的结合八、策略枚举的实现九、总结一、什么是策略模式 策略...
    99+
    2022-11-12
  • Java设计模式之策略模式深入刨析
    目录1.基本介绍2.传统方式3.采用策略模式4.策略模式的注意事项和细节1.基本介绍 1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之...
    99+
    2022-11-13
  • .Net行为型设计模式之策略模式(Stragety)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、策略模式的代码实现六、策略模式的实现要点:1、策略模式的主要优点有:2、策略...
    99+
    2022-11-13
  • Java行为型设计模式之策略模式怎么实现
    本文小编为大家详细介绍“Java行为型设计模式之策略模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java行为型设计模式之策略模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.策略设计模...
    99+
    2023-07-04
  • PHP行为设计模式之策略模式
    目录PHP策略模式(Strategy Pattern)适用性实现步骤优点缺点示例代码PHP策略模式(Strategy Pattern) 策略模式是一种行为设计模式,它允许在运行时选择...
    99+
    2023-05-15
    PHP行为设计模式 PHP策略模式
  • Java设计模式之策略模式
    在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。 一、概念理解 策略模式的概...
    99+
    2022-11-13
    Java 设计模式 策略模式
  • Java设计模式之java策略模式详解
    目录为什么使用策略模式?策略模式包含角色策略模式的类图排序案例策略模式的优点策略模式的缺点适用场景源码分析策略模式的典型应用Java Comparator 中的策略模式参考文...
    99+
    2022-11-12
  • 深入理解Java设计模式之原型模式
    目录一、前言二、什么是原型模式三、原型模式的适用场景四、原型模式的实现1.浅拷贝实现2.深拷贝实现五、总结一、前言 单例模式可以避免重复创建消耗资源的对象,但是却不得不共用对象。若是...
    99+
    2022-11-12
  • Java深入讲解二十三种设计模式之中的策略模式
    目录1 概述2 策略模式2.1 组成部分2.2 代码示例2.3 优缺点1 概述 在平时开发中,往往会遇到这样一种情况,实现一种功能有很多种算法或者策略,我们可以根据不同的算法或者策略...
    99+
    2022-11-13
  • Python设计模式中的行为型策略模式
    目录一、策略模式二、应用场景三、代码示例一、策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(...
    99+
    2022-11-13
  • 深入了解Java设计模式之职责链模式
    目录定义解决的问题核心要点类图代码实现抽象父类执行者-三个客户端拓展应用场景定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着...
    99+
    2022-11-13
  • Java设计模式之策略模式案例详解
    目录优缺点Spring中哪里使用策略模式策略模式设计图代码案例为什么使用策略模式 答:策略模式是解决过多if-else (或者switch-case)代码块的方法之一,提高代码的可维...
    99+
    2022-11-13
  • Java设计模式之策略模式示例详解
    目录定义结构UML类图UML序列图深入理解策略模式策略和上下文的关系策略模式在JDK中的应用该策略接口有四个实现类策略模式的优点策略模式的缺点策略模式的本质在讲策略模式之前,我们先看...
    99+
    2022-11-13
  • Java特性之设计模式【策略模式】
    一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随...
    99+
    2023-10-18
    策略模式 java 设计模式
  • Java 深入理解创建型设计模式之原型模式
    1.思考问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊。 按照传统的思路来,我们可能会按照下面的方式去写。 ...
    99+
    2022-11-13
  • java设计模式--策略模式详解
    目录策略模式Demo代码:总结策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来...
    99+
    2022-11-12
  • JavaScript设计模式之策略模式详解
    什么是设计模式?为什么需要学习设计模式? 学习设计模式的目的是:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络...
    99+
    2022-11-13
  • PHP行为设计模式之策略模式怎么实现
    这篇“PHP行为设计模式之策略模式怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP行为设计模式之策略模式怎么实现...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作