策略模式的小记

2024-09-07 00:20
文章标签 模式 策略 小记

本文主要是介绍策略模式的小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

策略模式

    • 策略模式
    • 支付系统【场景再现】
    • 硬编码完成不同的支付策略
    • 使用策略模式,对比不同
      • (1)支付策略接口
      • (2)具体的支付策略类
      • (3)上下文
      • (4)客户端
      • (5)小结

策略模式

定义:策略模式是一种行为设计模式,在运行时改变对象的行为。

目的:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

结构:

  • 策略接口:声明了所有支持的所有算法的公共接口。
  • 具体策略:实现了策略接口中声明的算法
  • 上下文:使用某个具体策略实例时,通常上下文会提供一个接口供客户端调用,内部则根据设定的策略来执行相应的算法。

支付系统【场景再现】

场景:支付系统 ,支付系统拥有多种不同的支付策略(信用卡,支付宝支付,微信支付)

在这里插入图片描述

硬编码完成不同的支付策略

依据传入支付策略不同,进行大量的if...else判断,倘若后续加入其他的第三方支付策略,则需要接着if...else代码冗余,耦合度搞,难以扩展(添加新的支付方式,必须修改processPayment方法)

public class Payment {public void processPayment(double amount, String paymentMethod) {if ("creditCard".equals(paymentMethod)) {System.out.println("Paying " + amount + " using credit card.");} else if ("alipay".equals(paymentMethod)) {System.out.println("Paying " + amount + " using Alipay.");} else if ("wechat".equals(paymentMethod)) {System.out.println("Paying " + amount + " using WeChat.");} else {throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);}}
}

测试类:

public class Client {public static void main(String[] args) {Payment payment = new Payment();payment.processPayment(100.0, "creditCard");payment.processPayment(200.0, "alipay");payment.processPayment(300.0, "wechat");}
}

使用策略模式,对比不同

  • 定义一个支付策略接口
  • 实现具体的支付策略类
  • 创建一个上下文类来使用具体的支付策略

(1)支付策略接口

public interface PaymentStrategy {void pay(double amount);
}

(2)具体的支付策略类

  1. 信用卡支付策略
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using credit card.");}
}
  1. 支付宝策略
public class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using Alipay.");}
}
  1. 微信支付策略
public class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying " + amount + " using WeChat.");}
}

(3)上下文

public class PaymentContext {private PaymentStrategy paymentStrategy;// 构造器注入策略public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void processPayment(double amount) {paymentStrategy.pay(amount);}
}

(4)客户端

public class Client {public static void main(String[] args) {// 创建不同的支付策略PaymentStrategy creditCardPayment = new CreditCardPayment();PaymentStrategy alipayPayment = new AlipayPayment();PaymentStrategy weChatPayment = new WeChatPayment();// 使用不同的支付策略PaymentContext context = new PaymentContext(creditCardPayment);context.processPayment(100.0);context = new PaymentContext(alipayPayment);context.processPayment(200.0);context = new PaymentContext(weChatPayment);context.processPayment(300.0);}
}

(5)小结

策略模式:

  • 定义一个支付策略接口PaymentStrategy
  • 实现三个具体的支付策略类CreditCardPayment,AlipayPaymentWeChatPayment
  • 上下文类PaymentContext,来使用具体的支付策略
  • 客户端测试代码中动态选择不同的支付层策略

策略模式主要关注的是算法或行为的选择和封装。它允许在运行时动态地选择不同的算法或行为。

策略模式适用于需要在运行时选择不同的算法或行为的情况。例如,不同的排序算法、支付方式等。

这篇关于策略模式的小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143533

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试