首页 > 其他分享 >策略模式

策略模式

时间:2023-10-22 20:36:49浏览次数:21  
标签:case 策略 模式 break cs new

策略模式

考虑一个场景,顾客买东西计算商品的总金额。如果活动的计算方式不同,应该如何写? 比如打折,满减,积分活动。

思路一:简单工厂模式,把打折的模式进行分类抽象。满减,打折等等传参不同归为不同的计算模式,然后工厂类去根据参数生产对应的实例。  实例返回的参数可以用多态思想

例如不同模式返回的对象是不同的,我们可以让这些不同的对象类型继承一个类,这样返回的时候进行多态的转换之后即可。

工厂类:

CashSuper cs = null; 多态的父类//

switch(打折模式){

case:满减

cs = new cashNormal()

break;

case:满300返10

CashReturn cs = new cashReturn("300",100)

cs = cr1;

break;

.....

这里在工厂类,定义了具体的打折细节参数,以至于我们如果对打折的具体改动就需要改工厂类。

 

}

 

 思路二:策略模式。在简单工厂的外面再封装一层Context类,用处是接受传入的模式,并调用其重写的方法。因为所有的模式都是继承了一个接口并重写一个公共方法。

这样我们不用每次去改工厂类

在业务逻辑代码中

CashContext cc = null;

switch(打折模式){

case:满减

cc = new cashContext(new cashNormal())

break;

case:满300返10

CashReturn cs = new cashContext(new CashReturn("300",100))

cs = cr1;

break;

 

思路三:策略+简单工厂
把模式选择从业务代码移动到策略Context类里面。

public class CashContext{
	private CashSuper cs;
	
	//通过构造方法,传入具体的收费策略
	public CashContext(int cashType){
		switch(cashType){
		case 1:
			this.cs = new CashNormal();
			break;
		case 2:
			this.cs = new CashRebate(0.8d);
			break;
		case 3:
			this.cs = new CashRebate(0.7d);
			break;
		case 4:
			this.cs = new CashReturn(300d,100d);
			break;
		}
	}
	
	public double getResult(double price,int num){
		//根据收费策略的不同,获取计算结果
		return this.cs.accpetCash(price,num)
	}
}

这样在业务逻辑代码中直接调用即可。

总结:策略模式和简单工厂模式的不同之处在于。  策略模式是用来对一系列算法抽象,得出不同的策略。   简单工厂方法,对于不同的参数,去生产不同实例,生产的不同实例之间更具有各自的特异性。

策略模式的精髓在于Context层。

返利计算,普通计算,积分计算等等都是一系列的算法,我们把这些算法通过继承思想继承到CashSuper接口,这是简单工厂方法:工厂类去调用CashSuper

 

再到策略模式,加入Context

Context用switch选择具体的策略,根据多态思想实例化出来不同算法相同的父类对象。然后再去调用不同算法重写的实现方法。

策略模式的应用场景是:可以把一类算法进行抽象归纳,继承同一个父类,重写同一个方法。

标签:case,策略,模式,break,cs,new
From: https://www.cnblogs.com/dwj-ngu/p/17781018.html

相关文章

  • 路由策略
    路由控制实现的三种方式: 控制路由的发布:通过路由策略对发布的路由进行过滤,只发布满足条件的路由。 控制路由的接收:通过路由策略对接收的路由进行过滤,只接收满足条件的路由。 控制路由的引入:通过路由策略控制从其他路由协议引入的路由条目,只有满足条件的路由才会被引入。路由匹配......
  • go中介模式
    Go设计模式--中介者,最后的模式!原创 _卡尔文 网管叨bi叨 2023-05-2208:45 发表于北京收录于合集#用Go学设计模式24个大家好,这里是每周都在陪你一起进步的网管~!今天继续学习设计模式,也是我们要学习的最后一个设计模式—中介者模式,对这个模式有一点了解后会觉得它跟我们......
  • 【C#9.0篇】Switch匹配模式新特性
    概述C#9.0中的switch匹配模式引入了许多新特性,其中一些特性是C#8.0中不存在的,比如以下特性:关系模式:可以使用关系运算符模式匹配+逻辑模式:可以使用模式匹配+逻辑模式(如and、or)来组合多个模式模式匹配+关系模式:可以使用模式匹配+关系运算符(如<、>、<=、>=、==、!=)默认的匹配......
  • 设计模式05 —— 模板模式
    设计模式05——模板模式本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)参考书:《图解设计模式》本系列为本人学习笔记,和课程学习笔记,资料和参考均源自互联网,希望各位大佬多多指点!介绍在模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模......
  • 设计模式-建造者模式
    建造者模式建造者模式(BuilderPattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。介绍意图:将一个复杂的构建与其表示相......
  • 【计算机视觉】计算机视觉与模式识别关于图像分割的学术速递[10.20]
    分割|语义相关(8篇)【1】PuttingtheObjectBackintoVideoObjectSegmentation标题:将对象放回视频对象分割中https://arxiv.org/abs/2310.12982我们提出了Cutie,一个具有对象级内存读取的视频对象分割(VOS)网络,它将内存中的对象表示放回视频对象分割结果中。最近的VOS工作采用自......
  • 2023 Q4 特斯拉销售策略分析 All In One
    2023Q4特斯拉销售策略分析AllInOne预测一波:特斯拉买不动了,要降价了❓问卷特斯拉购车调研尊敬的客户您好,诚邀您参与本次调研,我们始终致力于提升您的体验,您的反馈对我们至关重要。本次调研大概占用1-3分钟的时间,感谢支持!您近期主要考虑过特斯拉的哪款车型?*Mode......
  • 单例模式
    目录单例模式饿汉式懒汉式工厂模式简单工厂模式工厂方法模式工厂模式应用抽象工厂策略模式责任链模式应用单例模式属于创建者模式,提供了一种创建对象的方式单例有两种设计形式饿汉式--类加载的时候,这个对象就会被创建懒汉式--只有首次使用的时候,才会创建对象饿汉式想要......
  • 关于原始typescript实现todolist(装饰器模式)
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是原始typescript的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"react_ts","version":"1.0.0","description":"","main":"index.......
  • 设计模式-原型模式
    原型模式(PrototypePattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的......