Administrator
发布于 2024-07-30 / 15 阅读
0
0

策略模式

问题描述

实现一个收银程序,有3种收费方式:正常收费、打折收费(8折)、满减促销(满300-100),程序在尽量减少重复代码的前提下,实现正确的金额计算。

代码实现

收费抽象类

    public abstract class CashSuper
    {
        public abstract double AcceptCash(double money);
    }

具体的收费算法类,包括正常收费类CashNormal、打折收费类CashRebate、满减促销类CashReturn。

class CashNormal : CashSuper
{
    public override double AcceptCash(double money)
    {
        return money;
    }
}

class CashRebate : CashSuper
{
    public CashRebate(double moneyRebate)
    {
        mMoneyRebate = moneyRebate;
    }

    public override double AcceptCash(double money)
    {
        return money * mMoneyRebate;
    }

    private double mMoneyRebate;
}

class CashReturn : CashSuper
{
    public CashReturn(double mMoneyCondition, double mMoneyReturn)
    {
        this.mMoneyCondition = mMoneyCondition;
        this.mMoneyReturn = mMoneyReturn;
    }

    public override double AcceptCash(double money)
    {
        if (money >= mMoneyCondition)
        {
            return money - Math.Floor(money / mMoneyCondition) * mMoneyReturn;
        }
        return money;
    }

    private double mMoneyCondition;
    private double mMoneyReturn;

}

定义上下文类CashContext,维护对算法对象的引用

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

客户端调用:

    static void Main(string[] args)
    {
        CashContext sc1 = new CashContext("正常收费");
        CashContext sc2 = new CashContext("满返");
        CashContext sc3 = new CashContext("打折");

        Console.WriteLine(sc1.GetResult(300));
        Console.WriteLine(sc2.GetResult(300));
        Console.WriteLine(sc3.GetResult(300));
    }

结构组成

策略模式有三类主要角色组成:

  • 策略类:定义所有支持算法的公共接口,这个例子中为收费抽象类

  • 具体策略类:具体的算法,这个例子中为具体的正常收费、打折收费、满减优惠收费

  • 上下文类:维护对策略对象的应用

UML图


评论