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

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

定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,

           不会影响到使用算法的客户。

示例:商场收银系统,实现正常收费、满300返100、打8折.......等不同收费方式

效果图:

结构图

HTML代码

    设计模式:策略模式        
商场收银软件
单价:
数量:
计算方式:
正常收费
打8折
满300返100
总计:
View Code

CashContext类

public class CashContext    {        CashSuper cs = null;        public CashContext(string type)        {            switch (type)            {                case "正常收费":                    cs = new CashNormal();                    break;                case "满300返100":                    cs = new CashReturn("300", "100");                    break;                case "打8折":                    cs = new CashRebate("0.8");                    break;            }        }        public double GetResult(double money)        {            return cs.AcceptCash(money);        }    }
View Code

CashSuper类: 

///     /// 现金收费抽象类    ///     public abstract class CashSuper    {        public abstract double AcceptCash(double money);    }
View Code

CashNormal类:  

///     /// 正常收费子类    ///     public class CashNormal : CashSuper    {        public override double AcceptCash(double money)        {            return money;        }    }
View Code

CashRebate类

///     /// 打折收费子类    ///     public class CashRebate : CashSuper    {        private double moneyRebate = 1d;        public CashRebate(string moneyRebate)        {            this.moneyRebate = double.Parse(moneyRebate);        }        public override double AcceptCash(double money)        {            return money * moneyRebate;        }    }
View Code

CashReturn类

///     /// 返利收费子类    ///     public class CashReturn : CashSuper    {        private double moneyCondition = 0.0d;        private double moneyReturn = 0.0d;        public CashReturn(string moneyCondition, string moneyReturn)        {            this.moneyCondition = double.Parse(moneyCondition);            this.moneyReturn = double.Parse(moneyReturn);        }        public override double AcceptCash(double money)        {            double result = money;            if (money >= moneyCondition)            {                result = money -Math.Floor(money / moneyCondition) * moneyReturn;            }            return result;        }    }
View Code

客户端实现

protected void btnOK_Click(object sender, EventArgs e)        {            CashContext csuper = new CashContext(ddlCashType.SelectedValue);            string totalPrice = csuper.GetResult(Convert.ToDouble(txtNumber.Text)*Convert.ToDouble(txtPrice.Text)).ToString();            lblTotal.Text = totalPrice;        }
View Code

 

策略模式和简单工厂模式区别

用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍材就叫伐木斧,用来劈门就叫消防斧,这些模式的名字都是根据具体使用时的场景,联系了现实里某样东西或某种习惯而取得,所以很相似的模式行为有不同叫法很正常。

工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。

               即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建
策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
               即根据你给出对应的对象来执行对应的方法。
关注行为的选择

 

 

转载于:https://www.cnblogs.com/qianxingdewoniu/p/3540781.html

你可能感兴趣的文章
面试题
查看>>
51Nod:活动安排问题之二(贪心)
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
数据库框架的log4j日志配置
查看>>
lintcode-easy-Remove Element
查看>>
mysql 根据地图 坐标 查询 周边景区、酒店
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
switchcase的用法
查看>>
React.js 小书 Lesson15 - 实战分析:评论功能(二)
查看>>
Java基础03 构造器与方法重载
查看>>
软件项目经理职责[转](
查看>>
辗转相除求最大公约数
查看>>
Redis 主从集群搭建及哨兵模式配置
查看>>
nginx ------反向代理和负载均衡
查看>>
Linux下安装JDK
查看>>
[HDU] 3711 Binary Number [位运算]
查看>>
908. Smallest Range I
查看>>
ThinkPHP 分页实现
查看>>