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);
    这样简单工厂与策略模式结合方式让我们客户端与算法彻底隔离。
    定义:
    策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下 发生变化。
    策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个 抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。"
  • 相关阅读:
    nullnullConnecting with WiFi Direct 与WiFi直接连接
    nullnullUsing WiFi Direct for Service Discovery 直接使用WiFi服务发现
    nullnullSetting Up the Loader 设置装载机
    nullnullDefining and Launching the Query 定义和启动查询
    nullnullHandling the Results 处理结果
    装置输出喷泉装置(贪心问题)
    数据状态什么是事务?
    停止方法iOS CGD 任务开始与结束
    盘文件云存储——金山快盘
    函数标识符解决jQuery与其他库冲突的方法
  • 原文地址:https://www.cnblogs.com/JackWang/p/1763265.html
Copyright © 2011-2022 走看看