zoukankan      html  css  js  c++  java
  • 策略模式

    例子:
    有一天学校里面要请一些实习或者外聘讲师,他们都是讲一次拿一次钱,可是他们每个讲师的报酬却不一样,有的老师讲一节课200+超市卡,有的老师200会 打折一部份捐献给希望工程
    分析:
    我们可以看出,目前这个都是给讲师报酬,只是不同讲师报酬的计算方式不一样,我们可以算法不同去封装对象,于是我们可以用策略模式,策略模式结构图:



    分析代码:

        public  abstract class TeacherWages
        {
            public abstract double GetWages(double money);
        }

        //正常给的
        public class WagesA : TeacherWages
        {
            public override double GetWages(double money)
            {
                return money;
            }
        }

        //折扣的报酬
        public class WagesB : TeacherWages
        {
            private double moneyRebate = 1;
            public WagesB(double _moneyRebate)
            {
                this.moneyRebate = _moneyRebate;
            }

            public override double GetWages(double money)
            {
                return money*moneyRebate;
            }
        }

        //多给100元超市购物卡
        public class WagesC : TeacherWages
        {
            public double moneyCondition = 0;

            public WagesC(double _moneyCondition)
            {
                this.moneyCondition = _moneyCondition;
            }

            public override double GetWages(double money)
            {
                return money + moneyCondition;
            }
        }
    此时我们已经将我们的算法都封装起来了,现在我们实现我们的收费策略:
      //收费策略
        public class WareContext
        {
            private TeacherWages teacherware;

            public WareContext(TeacherWages _teacherware)
            {
                teacherware = _teacherware;
            }

            public double GetWare(double money)
            {
                return teacherware.GetWages(money);
            }
        }
    客户端调用:
      WareContext _context;
                string _type = "";
                switch (_type)
                {
                    case "A":
                        _context=new WareContext(new WagesA());
                        break;
                    case "B":
                        _context=new WareContext(new WagesB("0.8"));
                        break;
                          case "C":
                        _context=new WareContext(new WagesC(100));
                        break;
                    default:
                        _context = null;
                       break;
                }
                _context.GetWare(200);
    我们不想将创建对象放在客户端,我想把判断从客户端移走:
     public class WaresContext
        {
            private TeacherWages teacherware;

            public WaresContext(string _type)
            {
                switch (_type)
                {
                    case "A":
                        teacherware = new WagesA();
                        break;
                    case "B":
                        teacherware = new WagesB(0.8);
                        break;
                    case "C":
                        teacherware = new WagesC(100);
                        break;
                    default:
                        teacherware = null;
                        break;
                }
            }

            public double GetWare(double money)
            {
                return teacherware.GetWages(money);
            }
        }
    客户端调用:
    WaresContext context = new WaresContext("A");
                context.GetWare(200);
    这样简单工厂与策略模式结合方式让我们客户端与算法彻底隔离。
    定义:
    策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下 发生变化。
    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个 抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。"
  • 相关阅读:
    Codeforces 916E Jamie and Tree (换根讨论)
    BZOJ 3083 遥远的国度 (换根讨论 + 树链剖分)
    Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
    ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
    HDU 4343 Interval query(贪心 + 倍增)
    Codeforces 147B Smile House(DP预处理 + 倍增)
    HDU 4870 Rating (高斯消元)
    TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
    Hrbust 2320 OX (博弈)
    Hrbust 2319 Number Game(贪心)
  • 原文地址:https://www.cnblogs.com/JackWang/p/1763265.html
Copyright © 2011-2022 走看看