2018-04-30 18:59:04.

由 委托的 动态选择方法 联想到的 Strategy Pattern

一 :

策略模式 将  宿主   与  算法 分离, 算法被封装为对象, 客户端代码用 抽象类 或 接口来调用。实现运行时的动态选择。

二:

  • 抽象算法接口的方法要引用 宿主。
  • Factory Method 来实现正确的算法选择, 具体算法的枚举为其提供信息,在其静态方法中作为参数。Switch选择。
  • 宿主引用 IStrategy ,
  • 构造器注入并在其代码中 使用 Factory Method 静态方法选择算法。
  • 宿主含有一个方法可以 让 IStrategy的私有变量 来根据 (this ) 计算想要的结果并返回。

以购物篮 根据不同的折扣 结算为例。

1. 购物篮:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 public class Baskets
10 {
11 //引用 IStrategyMethod 抽象策略
12 private IStrategy_DiscountMoney _strategy;
13
14 //构造器注入 枚举
15 public Baskets(DiscountType type)
16 {
17 _strategy = StrategyFactory.DiscountBy(type);
18 }
19
20 // 自身给予strategy 判断的依据
21 public decimal OriginalPrice { get; set; }
22
23 // 获取所要的结果 动态选择
24 public decimal PriceAfterDiscount()
25 {
26 return _strategy.TotalAfterDisBy(this);
27 }
28
29 }
30 }

2. 策略接口,方法引用购物篮

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 public interface IStrategy_DiscountMoney
10 {
11 // 具体算法由变化的 Baskets 中的策略因素而决定
12 decimal TotalAfterDisBy(Baskets basket);
13 }
14 }

3. 具体策略的实现

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 public class DiscountByMoney : IStrategy_DiscountMoney
10 {
11 public decimal TotalAfterDisBy(Baskets basket)
12 {
13 if (basket.OriginalPrice < 100)
14 return basket.OriginalPrice - 20m;
15 else if (basket.OriginalPrice < 50)
16 return basket.OriginalPrice - 10m;
17 else
18 return basket.OriginalPrice;
19 }
20 }
21 }
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 public class DiscountByPercent : IStrategy_DiscountMoney
10 {
11 public decimal TotalAfterDisBy(Baskets basket)
12 {
13 return basket.OriginalPrice * 0.8m;
14 }
15 }
16 }
NullObject 模式

4. Factory Method 选择正确算法, 枚举要为其静态方法提供判断依据

枚举:还要为宿主的构造器注入

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 // 为了让 Factory Method 模式能够构建正确的折扣模式
10 // 需要以枚举形式提供一些信息
11 //
12 public enum DiscountType
13 {
14 DiscountByMoney = 0,
15 DiscountByPercent = 1,
16 NullObjectPattern = 2
17 }
18 }

Factory Method:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Strategy.Model
8 {
9 // 确定将哪种策略算法应用到basket => Factory Method
10 public class StrategyFactory
11 {
12 // 宿主引用了 抽象算法的接口
13 // 具体算法的枚举提供信息
14 public static IStrategy_DiscountMoney DiscountBy(DiscountType type)
15 {
16 switch (type)
17 {
18 case DiscountType.DiscountByMoney:
19 return new DiscountByMoney();
20 case DiscountType.DiscountByPercent:
21 return new DiscountByPercent();
22 default:
23 return new NullObjectPattern();
24 }
25 }
26 }
27 }

Software_C#_grammer_Deletegate--Strategy的更多相关文章

  1. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...

  2. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  3. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  4. C#设计模式系列:策略模式(Strategy)

    1.策略模式简介 1.1>.定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致.客户只关心目标而不在意具体的实现方法,实现方法要根据具体 ...

  5. Switch to strategy

    namespace RefactoringLib.SwitchToStrategy.Before { public class ClientCode { public decimal Calculat ...

  6. 5.Inheritance Strategy(继承策略)【EFcode-first系列】

    我们已经在code-first 约定一文中,已经知道了Code-First为每一个具体的类,创建数据表. 但是你可以自己利用继承设计领域类,面向对象的技术包含“has a”和“is a”的关系即,有什 ...

  7. 策略模式 - Strategy

    Strategy Pattern,定义算法家族,分别封装起来,互相之间可替换,此模式让算法的变化不会影响到使用算法的客户端. // 上下文类(Context):用一个ConcreteStratege来 ...

  8. 十一个行为模式之策略模式(Strategy Pattern)

    定义: 定义一系列的算法,将每一个算法封装起来,并使它们之间可以相互替换,让算法具有可扩展性和对立性. 结构图: Context:环境类,算法的使用者.对外提供了算法使用的接口,并且持有一个抽象算法类 ...

  9. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  10. Strategy pattern策略模式

    在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式. 一.策略模式的定义 ...

随机推荐

  1. 线段树套线性基——题解P4839 P哥的桶

    文章历史 2022-08-03: 文章初稿,由于对算法介绍过于少而被管理员打回重造. 2020-08-06:将算法介绍进行扩写,并删除了一些可有可无的内容或玩梗内容. 管理员审核题解辛苦了. 简要题意 ...

  2. CSS中知

    1CSS特性    1.3优先级    1.4权重叠加计算 2Chrome调试工具     2.1查错流程 3CSS盒子模型    3.1内容的宽度和高度    3.2边框(border)-连写形式 ...

  3. px批量转vw方法,适用于用户临时突发自适应需求,快速搞出项目多屏幕适应方案postcss-px-to-viewport,postcss.config.js配置

    方案一: 1. 下载依赖 npm install postcss-import postcss-loader postcss-px-to-viewport --save-dev npm install ...

  4. 流程概述与顺序结构-选择结构_单if语句

    流程概述与顺序结构 概述 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说,程序的流程对运行结果 有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要 ...

  5. 【分析笔记】全志平台 TWI 上拉电压异常的问题

    记录说明 原本这么简单的芯片,没有必要做记录,后来发现其中有一颗单独挂在 TWI2 无法通信,而主要原因是最容易忽视的电源域的问题,因此记录一下这件事情. 芯片介绍 MCP3021 是一颗 10BIT ...

  6. 学习ASP.NET Core Blazor编程系列二十五——登录(4)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  7. JAVA虚拟机18---方法调用

    1.简介 方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还未涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作 ...

  8. vivo官网App模块化开发方案-ModularDevTool

    作者:vivo 互联网客户端团队- Wang Zhenyu 本文主要讲述了Android客户端模块化开发的痛点及解决方案,详细讲解了方案的实现思路和具体实现方法. 说明:本工具基于vivo互联网客户端 ...

  9. SQL 实现全字段分组,每组取一条记录,记录满足:组内时间最大,组内不同类型数量求和

    1 SELECT 2 TT.CLASS_ID AS "classId", 3 TT.TEMPLATE_ID AS "templateId" , 4 TT.MSG ...

  10. Vue框架:6、Vue组件间通信,动态组件,插槽,计算属性,监听属性

    目录 前端开发之Vue框架 一.Vue组件间通信 1.组件间通讯父传子 2.组件间通讯子传父 3.ref属性 二.动态组件 1.不使用动态组件 2.使用动态组件 3.keep-alive保持组件不销毁 ...