博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:4589 次
发布时间:2019-06-09

本文共 2743 字,大约阅读时间需要 9 分钟。

概念:本文中的“使用策略类” 是指用设计模式中的策略模式来替换原来的switch case和if else语句,这样可以解开耦合,同时也使维护性和系统的可扩展性大大增强。

正文:如下面代码所示,ClientCode 类会更加枚举State的值来调用ShippingInfo 的不同方法,但是这样就会产生很多的判断语句,如果代码量加大,类变得很大了的话,维护中改动也会变得很大,每次改动一个地方,都要对整个结构进行编译(假如是多个工程),所以我们想到了对它进行重构,剥开耦合。

namespace LosTechies.DaysOfRefactoring.SwitchToStrategy.Before{    public class ClientCode    {        public decimal CalculateShipping()        {            ShippingInfo shippingInfo = new ShippingInfo(); return shippingInfo.CalculateShippingAmount(State.Alaska); } } public enum State { Alaska, NewYork, Florida } public class ShippingInfo { public decimal CalculateShippingAmount(State shipToState) { switch (shipToState) { case State.Alaska: return GetAlaskaShippingAmount(); case State.NewYork: return GetNewYorkShippingAmount(); case State.Florida: return GetFloridaShippingAmount(); default: return 0m; } } private decimal GetAlaskaShippingAmount() { return 15m; } private decimal GetNewYorkShippingAmount() { return 10m; } private decimal GetFloridaShippingAmount() { return 3m; } } }

重构后的代码如下所示,抽象出一个IShippingCalculation 接口,然后把ShippingInfo 类里面的GetAlaskaShippingAmount、GetNewYorkShippingAmount、GetFloridaShippingAmount三个方法分别提炼成三个类,然后继承自IShippingCalculation 接口,这样在调用的时候就可以通过IEnumerable<IShippingCalculation> 来解除之前的switch case语句,这和IOC的做法颇为相似。

using System;using System.Collections.Generic;using System.Linq;namespace LosTechies.DaysOfRefactoring.SwitchToStrategy.After_WithIoC{    public interface IShippingInfo { decimal CalculateShippingAmount(State state); } public class ClientCode { [Inject] public IShippingInfo ShippingInfo { get; set; } public decimal CalculateShipping() { return ShippingInfo.CalculateShippingAmount(State.Alaska); } } public enum State { Alaska, NewYork, Florida } public class ShippingInfo : IShippingInfo { private IDictionary
ShippingCalculations { get; set; } public ShippingInfo(IEnumerable
shippingCalculations) { ShippingCalculations = shippingCalculations.ToDictionary(calc => calc.State); } public decimal CalculateShippingAmount(State shipToState) { return ShippingCalculations[shipToState].Calculate(); } } public interface IShippingCalculation { State State { get; } decimal Calculate(); } public class AlaskShippingCalculation : IShippingCalculation { public State State { get { return State.Alaska; } } public decimal Calculate() { return 15m; } } public class NewYorkShippingCalculation : IShippingCalculation { public State State { get { return State.NewYork; } } public decimal Calculate() { return 10m; } } public class FloridaShippingCalculation : IShippingCalculation { public State State { get { return State.Florida; } } public decimal Calculate() { return 3m; } } }

转载于:https://www.cnblogs.com/ingstyle/p/10234777.html

你可能感兴趣的文章
python基础之生成器、三元表达式、列表生成式、生成器表达式
查看>>
mybatis 思考
查看>>
不让padding影响元素的宽度
查看>>
cocos2d-x游戏开发系列教程-超级玛丽01-前言
查看>>
如何做一个快乐的人
查看>>
外网无法访问tomcat
查看>>
[LeetCode] Delete Duplicate Emails
查看>>
excel如何用公式判断单元格的值是否为数字、英文、中文,以及相应的计数
查看>>
软件协作工具Trello
查看>>
快速搭建windows服务器的可视化运维环境
查看>>
java多线程读取、操作List集合
查看>>
Jboss EAP 6 EJB调用常见问题
查看>>
SQL优化 查询语句中,用 inner join 作为过滤条件和用where作为过滤条件的区别
查看>>
mongodb入门
查看>>
猫眼电影top100抓取
查看>>
【codeforces】【比赛题解】#862 CF Round #435 (Div.2)
查看>>
SpringCloud学习笔记(8)----Spring Cloud Netflix之负载均衡-Ribbon的负载均衡的策略
查看>>
并发编程学习笔记(3)----synchronized关键字以及单例模式与线程安全问题
查看>>
2-9
查看>>
python多线程(一)
查看>>