Software_C#_grammer_Deletegate--Strategy
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 }
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的更多相关文章
- Java设计模式之策略模式(Strategy)
前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
- C#设计模式系列:策略模式(Strategy)
1.策略模式简介 1.1>.定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致.客户只关心目标而不在意具体的实现方法,实现方法要根据具体 ...
- Switch to strategy
namespace RefactoringLib.SwitchToStrategy.Before { public class ClientCode { public decimal Calculat ...
- 5.Inheritance Strategy(继承策略)【EFcode-first系列】
我们已经在code-first 约定一文中,已经知道了Code-First为每一个具体的类,创建数据表. 但是你可以自己利用继承设计领域类,面向对象的技术包含“has a”和“is a”的关系即,有什 ...
- 策略模式 - Strategy
Strategy Pattern,定义算法家族,分别封装起来,互相之间可替换,此模式让算法的变化不会影响到使用算法的客户端. // 上下文类(Context):用一个ConcreteStratege来 ...
- 十一个行为模式之策略模式(Strategy Pattern)
定义: 定义一系列的算法,将每一个算法封装起来,并使它们之间可以相互替换,让算法具有可扩展性和对立性. 结构图: Context:环境类,算法的使用者.对外提供了算法使用的接口,并且持有一个抽象算法类 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- Strategy pattern策略模式
在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式. 一.策略模式的定义 ...
随机推荐
- BatteryStatsHelper.java源码分析
在分析PowerUsageSummary的时候,其实可以发现主要获取应用和服务电量使用情况的实现是在BatteryStatsHelper.java中 还是在线网站http://androidxref. ...
- VUE assets里的scss没有引用会被打包进代码里,本地代码和打包后的代码样式不一致解决办法
1.打包部署后,发现样式和本地运行时候代码不一致 经过排查发现 这个路径的文件被打包进去了,但是我并没有引用这个文件啊啊啊啊啊a~~~~ src\assets\webgl-assets\scss\st ...
- .NET周报【1月第4期 2023-01-28】
由于微信公众号排版问题,建议大家在PC端浏览. 国内文章 C# 很少人知道的科技 https://blog.lindexi.com/post/C-很少人知道的科技.html 本文来告诉大家在C#很少有 ...
- Java 进阶P-4.4+P-4.5
子类和父类的关系 在java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类.子类可以通过extends关键字来继承父类.做个比较通俗的比喻,就像一个父亲可以有多个亲孩子,但是一个孩子只能有 ...
- Unity之生成扫描二维码
Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...
- 线程基础知识 04 synchronized锁的四种状态和升级
转https://www.cnblogs.com/mingyueyy/p/13054296.html 1 轻量级锁和重量级锁简要说明 线程调度本来是由操作系统来管理的.现在,操作系统上跑了一个虚拟机J ...
- Spring IOC官方文档学习笔记(十一)之使用JSR 330标准注解
1.使用@Inject和@Named进行依赖注入 (1) Spring提供了对JSR 330标准注解的支持,因此我们也可以使用JSR 330标准注解来进行依赖注入,不过,在此之前,我们得先使用mave ...
- git拉取新分支、删除分支、修改远程分支
1.拉取新分支 git checkout master 切换到master分支 git pull 更新到最新代码 ...
- vue中所有的封装方式总结
如何确定我需要封装呢? 1.复用,如果觉得以后还会用到 2.你觉得方便,别的地方可能也需要用 3.如果不封装,页面代码臃肿的时候 1.封装API 使用场景:业务中最常见最普通的封装 详细在这篇:htt ...
- 重新配置 Idea Webapp 部署
一般 Idea 创建一个 Webapp 时已经自动配置好了,但难免出现意想不到的意外,例如,访问资源 404,编译之后没有把 jsp 页面部署进去等问题. 1️⃣第一步,配置 Project Sett ...