策略模式

简单易用策略模式分析与实例详解

一笑奈何 提交于 2019-12-04 09:37:16
1.简介 In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use. ——Quote from wikipedia 在计算机编程中,策略模式(也称为策略模式)是一种行为软件设计模式,它支持在运行时选择算法。代码接收运行时指令,而不是直接实现单个算法,这些指令在一系列算法中使用。 [站外图片上传中...(image-c98784-1573659608688)] 2.策略模式的特点 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为

策略模式概述

前提是你 提交于 2019-12-04 04:54:35
策略模式 优点以及定义 策略模式是一种从算法的角度上考虑问题的方式,所有需要算法解决的问题,都可以采用策略模式的角度,降低算法与算法之间的偶尔度 偶尔度说白了就是一个方法对于一个方法的依赖性,就是删除一个方法尽可能少的影响其他的方法 使用 其实我们在开发的过程中,都使用过策略模式,只是我们本身没有去注意摆了 举例说明使用 现在我们要做一个表单验证 正常新情况下 $('#btn_send').click(function(){ var username=$('#username').val(); var qq=$('#qq').val(); var pass=$('#new_password').val(); var newpass=$('#password').val(); var emil=$('#emil').val(); var tel=$('#tel').val(); if(username<4){ layer.msg('用户名不正确',{time:1500}); return false; } if(newpass<4){ layer.msg('密码格式不正确',{time:1500}); return false; } if(newpass!=pass){ layer.msg('两次密码不一致',{time:1500}); return false; } if(qq<6

【设计模式】策略模式

萝らか妹 提交于 2019-12-04 04:27:07
策略模式 2019-11-10 17:45:09 by冲冲 1、概念 策略模式(Strategy Pattern),创建 多个不同的策略对象(实现同一个策略接口) 和 一个使用策略(将策略对象注册为属性成员)的context对象 。 本质:设计多个算法方案(它们实现同一个接口,具备可扩展性)。 解决:取代if-else结构。 2、完整代码 1 //算法标准 2 interface Calculate { 3 public int calculate(int a, int b);//操作数,被操作数 4 } 5 6 //实现算法标准的加法 7 class Addition implements Calculate{/ 8 @Override 9 public int calculate(int a, int b) {//加数与被加数 10 return a + b;//这里我们做加法运算 11 } 12 } 13 14 //实现算法标准的减法 15 class Subtraction implements Calculate{//实现算法接口 16 @Override 17 public int calculate(int a, int b) {//减数与被减数 18 return a - b;//这里我们做减法运算 19 } 20 } 21 22 /

策略模式-设计模式

跟風遠走 提交于 2019-12-04 04:07:47
在讲述之前,我们首先看小例子: 现实生活中我们去商场上买东西的时候,卖场经常根据不同的客户来制定不同的报价策略,比如新客户不打折扣,针对老客户打9折,针对VIP打8折…… 现在我们做一个报价管理模块,简要点就是针对不同的客户,提供不同的报价。 假如是有你来做,你会怎么做? 在日常的开发中,我们大部分会写出如下的代码片段: public class QuoteManager { public BigDecimal quote(BigDecimal originalPrice,String customType){ if ("新客户".equals(customType)) { System.out.println("抱歉!新客户没有折扣!"); return originalPrice; }else if ("老客户".equals(customType)) { System.out.println("恭喜你!老客户打9折!"); originalPrice = originalPrice.multiply(new BigDecimal(0.9)).setScale(2,BigDecimal.ROUND_HALF_UP); return originalPrice; }else if("VIP客户".equals(customType)){ System.out.println(

初学设计模式之策略模式

一个人想着一个人 提交于 2019-12-04 02:25:55
策略模式的代码例子 1 //策略模式 2 #include<iostream> 3 using namespace std; 4 5 class strategy 6 { 7 public: 8 virtual void Do() 9 {}; 10 }; 11 class strategy1:public strategy 12 { 13 public: 14 void Do() 15 { 16 cout<<"策略1"<<endl; 17 } 18 }; 19 class strategy2:public strategy 20 { 21 public: 22 void Do() 23 { 24 cout<<"策略2"<<endl; 25 } 26 }; 27 class Context 28 { 29 private: 30 strategy *m_strategyPtr; 31 public: 32 Context(strategy *_strategyPtr) 33 { 34 m_strategyPtr=_strategyPtr; 35 }; 36 void exec() 37 { 38 m_strategyPtr->Do(); 39 }; 40 }; 41 int main() 42 { 43 strategy1 m_Strategy1; 44 Context m

设计模式 - 策略模式

谁都会走 提交于 2019-12-03 22:35:42
在理解策略模式之前我们假设有这样一个需求场景:我们在写订单支付场景的代码时,客户可以选择多种支付方式,有银联支付、支付宝支付、微信支付、京东白条等等。然后我们就很可能就会编写出类似下面这样的代码: /** * 订单类,拥有一个支付方法 * * @author eamon.zhang * @date 2019-11-06 上午9:18 */ public class Order { // 订单id private String orderId; // 支付方式 private String payType; // 订单金额 private long amount; public Order(String orderId, String payType, long amount) { this.orderId = orderId; this.payType = payType; this.amount = amount; } /** * 订单支付方法 * * @return */ public boolean pay() { // 是否支付成功 boolean payment = false; if ("aliPay".equals(payType)) { System.out.println("用户选择 支付宝 支付,订单号为:" + orderId + " ,支付金额:" +

策略模式和工厂模式搭配使用

冷暖自知 提交于 2019-12-03 14:30:16
需求 针对店下商铺,有这样一个需求,对用户客户分为了普通客户、 vip 客户、超级 vip 用户、专属 vip 用户 4 个等级,每当用户购买商品时,针对不同的用户等级和消费金额采取不同的打折优惠策略。在平常的开发当中,必然会出现多层的 if-else 嵌套判断,先判断用户的等级再判断用户购买商品的消费金额。 弊端 以上的情况出现了多层的 if-else 嵌套,除此之外,以后如果需求再有变动,需要再增加一个用户等级,那么又会再次添加 if-else 的嵌套判断,那么如何解决上述的弊端呢,采用策略模式和工厂模式的搭配使用,可以很好地优化多层 if-else 的多层嵌套 实现 编写用户等级枚举类 package com.zbiti.ifelse.UserType; /** * 用户类型枚举类 */ public enum UserPayServiceEnum { VIP(1,"Vip"), SUPERVIP(2,"SuperVip"), PARTICULALYVIP(3,"ParticularlyVip"), NORMAL(4,"NormalPayService"); /** * 状态值 */ private int code; /** * 类型描述 */ private String value; private UserPayServiceEnum(int code, String

策略模式

孤街浪徒 提交于 2019-12-03 13:26:40
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决: 将这些算法封装成一个一个的类,任意地替换。 关键代码: 实现同一个接口。 应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

策略模式

允我心安 提交于 2019-12-03 13:09:13
网上的例子: 僵尸Demo: https://blog.csdn.net/qq_32175491/article/details/79465496 不同充值方式的打折: https://blog.csdn.net/u011507568/article/details/70238491 自我最终理解: 策略模式就是将一个类如类A里面的方法(会变的方法)由具体实现----》抽象为 一个接口,调用A类的方法时,A类去调用接口的方法(运行时多使得调用接口实现类的方法)。 这样就将变化的行为解耦出来了(行为变化时加一个行为实现类,这样就不用改这个A类了) 策略模式最最难理解的问题的答案: 1、策略模式的缺点是加了策略接口和多个策略类,那这样我们使用策略模式还有什么意义? 答:如果只是一个行为的话,如我们例子中的只有一个方法say()。确实没有意义。 计算一下: 不使用策略: 当say方法变化时,我们就加一个实现类。变化10次加10个实现类 使用策略: 当say方法变化时,加一个SayBehavior接口的实现类,变化10次加10个,因为相对于不使用策略我们加了策略接口,所以还要麻烦点但是如果有两个行为的话,如say,move ,每个方法有十种不同的实现,那么不使用策略要加100个实现类 使用策略模式只要20个策略类, 如果3个行为,那么分别是1000个实现类, 30个策略类 ...

用设计模式来替代if-else

懵懂的女人 提交于 2019-12-03 09:57:58
用设计模式来替代if-else 前言 物流行业中,通常会涉及到EDI报文(XML格式文件)传输和回执接收,每发送一份EDI报文,后续都会收到与之关联的回执(标识该数据在第三方系统中的流转状态)。这里枚举几种回执类型: MT1101、MT2101、MT4101、MT8104、MT8105、MT9999 ,系统在收到不同的回执报文后,会执行对应的业务逻辑处理。当然,实际业务场景并没有那么笼统,这里以 回执处理为演示案例 模拟一个回执类 @Data public class Receipt { /** * 回执信息 */ String message; /** * 回执类型(`MT1101、MT2101、MT4101、MT8104、MT8105、MT9999`) */ String type; } 模拟一个回执生成器 public class ReceiptBuilder { public static List<Receipt> generateReceiptList(){ //直接模拟一堆回执对象 List<Receipt> receiptList = new ArrayList<>(); receiptList.add(new Receipt("我是MT2101回执喔","MT2101")); receiptList.add(new Receipt("我是MT1101回执喔",