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. day07-Spring管理Bean-IOC-05

    Spring管理Bean-IOC-05 3.基于注解配置bean 3.3自动装配 基本说明: 基于注解配置bean,也可以实现自动装配,使用的注解是:@AutoWired或者@Resource @Au ...

  2. 车牌识别服务-JAVA+ONNX版本,支持全类型的车牌

    1.车牌识别简介 车牌识别分为车牌检测与识别,检测模型一般需要检查车牌的位置识别模型一般为识别车牌号及车牌的颜色类型等,目前有较多的深度学习模型能支持,这里就不详细说了. 自动识别车辆车牌信息,应用于 ...

  3. CAN2-CH32V307CAN2使用说明与CAN波特率计算方法

    一.修改引脚 CH32V307CAN2的TX为PB13,RX为PB12 注意用CAN2时需要初始化CAN1的时钟. 二.配置CAN2过滤器开始的组(组号与图24-4相对应) 三.将FIFO0改为FIF ...

  4. 图解B树及C#实现(3)数据的删除

    目录 前言 从叶子节点删除数据 从非叶子节点删除数据 提前扩充只有 t-1 的 Item 的节点:维持 B树 平衡的核心算法 从左兄弟节点借用 Item 从右兄弟节点借用 Item 与左兄弟节点或者右 ...

  5. Kubernetes(k8s)控制器(二):DaemonSet

    目录 一.系统环境 二.前言 三.DaemonSet 概览 四.创建DaemonSet 4.1 创建daemonset 让其在k8s集群所有worker节点运行pod 4.2 创建daemonset让 ...

  6. java并发AQS中应用:以acquire()方法为例来分析线程间的同步与协作

    谈到java中的并发,我们就避不开线程之间的同步和协作问题,谈到线程同步和协作我们就不能不谈谈jdk中提供的AbstractQueuedSynchronizer(翻译过来就是抽象的队列同步器)机制: ...

  7. ROS入门:话题

    1.listener.cpp #include "ros/ros.h" #include "std_msgs/String.h" //回调函数,接收到话题后进入 ...

  8. SQL 注入之:SQL Server 数据库

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. SQ ...

  9. Me-and-My-Girlfriend-1

    Me-and-My-Girlfriend-1 目录 Me-and-My-Girlfriend-1 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 GetShell 2. ...

  10. js替换字符中指定所有字符

    //js \n全部替换<br/> function tranceBr(str) { return str.replace(/\n/g, '<br/>'); }