设计模式之简单模式与策略模式

        最近在学习简单工厂模式与策略模式时,发现他们有很多相同之处,他们都是通过多态来实现不同子类的选取,比较难分辨,于是做了一下总结。

      简单工厂模式用于比如算法之于加减乘除、水果之于苹果梨香蕉、文具之于笔尺,这些例子的共同特点就是具体、数量有限,不涉及复杂的算法,简单工厂模式只是解决了对象的创建问题,工厂类中封装了所有的选择过程,如果对象要增加、减少、变化,就要改动工厂,以至于代码的重写量增大,并且在操作过程中,客户需要指定一个参数给工厂,工厂按照参数选择出需要实例化的派生类。在简单工厂模式中,客户需要知道抽象基类和工厂类,工厂类用来生成对象,使用抽象基类的接口来完成工作。它的核心是“简单模式是用来封装所有对象的”。

      下面是一个简单工厂模式的例子:

       

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 简单工厂模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Operation oper;
            oper = OperationFactory.createOperate("+");
            oper.NumberA = 1;
            oper.NumberB = 4;
            double result = oper.GetResult();
            Console.WriteLine("结果是:" + result);

        }
        public class Operation//抽象类
        {
            private double _numberA = 0;
            private double _numberB = 0;

            public double NumberA
            {
                get { return _numberA; }
                set { _numberA = value; }
            }
            public double NumberB
            {
                get { return _numberB; }
                set { _numberB = value; }
            }
            public virtual double GetResult()
            {
                double result = 0;
                return result;
            }
        }
        class OperationAdd : Operation//基类:加法
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA + NumberB;
                return result;
            }
        }
        class OperationSub : Operation//减法
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA - NumberB;
                return result;
            }
        }
        class OperationMul : Operation//乘法
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }
        class OperationDiv : Operation//除法
        {
            public override double GetResult()
            {
                double result = 0;
                if (NumberB == 0)
                    throw new Exception("除数不能为0。");
                result = NumberA / NumberB;
                return result;
            }
        }
        //工厂类
        public class OperationFactory
        {
            public static Operation createOperate(string operate)
            {
                Operation oper = null;
                switch (operate )
                {
                    case "+":
                        oper = new OperationAdd();
                        break;
                    case "-":
                        oper = new OperationSub();
                        break;
                    case "*":
                        oper = new OperationMul();
                        break;
                    case "/":
                        oper = new OperationDiv();
                        break;
                }
                return oper;
            }

        }
    }
}

       由于产品对象形式经常改变,使用简单工厂模式则会导致代码重新编写,而策略模式则避免了这一点,它定义了算法家族,分别封装起来,让他们之间可以相互替换,算法的变化不会影响到客户对算法的使用,适用于大量复杂运算,它和简单工厂模式的区别就是,它没有工厂类,而是将工厂类的代码写到了客户端,客户端包括具有各种功能的代码,策略模式在使用时首先要创建一个类,将该类的对象传递进去,通过该对象调用不同的算法,下面的Context就是这个作用,它将使用选择对象的工厂交给了使用该模式的用户.它的核心是:策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中遇到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性.

       下面是一段策略模式的例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ce
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cbxType.Items.Add("正常收费");
            cbxType .Items .Add ("打折收费");
            cbxType .Items.Add ("返利收费");
        }
                private void btnOk_Click(object sender, EventArgs e)
        {
           CashSuper csuper=CashFactory .CreateCashAccept (cbxType.SelectedItem.ToString());

        }
           //现金收取抽象类
        abstract class CashSuper
        {
            public abstract double acceptCash(double money);
        }
        //正常收费子类
        class CashNormal:CashSuper
        {
            public override  double acceptCash(double money)
            {
                return money;
            }
        }
        //打折收费子类
        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;
            }
        }
        //返利收费子类
        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;
            }
        }
        //现金收费工厂类
        class CashFactory
        {
            public static CashSuper CreateCashAccept(string type)//现金收取工厂
            {
                CashSuper cs=null;
                switch (type)
                {
                    case "正常收费":
                        cs=new CashNormal ();
                        break ;
                    case "满300返100":
                        CashReturn cr1=new CashReturn ("300","100");
                        cs=cr1;
                        break ;
                    case "打8折":
                        CashRebate cr2=new CashRebate ("0.8");
                        cs=cr2;
                        break ;
                }
                return cs ;
            }
        }
        class CashContext
        {
            private CashSuper cs;//声明一个CashSuper对象;

            public CashContext (CashSuper csuper)//通过构造方法,传入具体的收费策略;
            {
                this.cs=csuper ;
            }
            public double GetResult(double money)
            {
                return cs.acceptCash (money );//根据收费策略不同获得计算结果;
            }
        }

        //客户端窗体程序

        double total=0.0d;
        private void bntOk_Click(object sender, EventArgs e)
        {
            CashContext cc=null ;
            switch (cbxType .SelectedItem .ToString ())
            {
                case "正常收费":
                    cc=new CashContext (new CashNormal ());
                    break;
                case "满300返100":
                    cc=new CashContext (new CashReturn ("300","100"));
                    break ;
                case "打8折":
                    cc=new CashContext (new CashRebate ("0.8"));
                    break ;

            }
            CashSuper csuper = CashFactory.CreateCashAccept(cbxType.SelectedItem.ToString());
            double totalPrices=0d;
            //通过多态,可以得到收费的结果
            totalPrices =csuper .acceptCash (Convert .ToDouble(txtPrice .Text)*Convert.ToDouble (txtNum.Text ) );
            total=total+totalPrices;
            lbxList .Items.Add("单价:"+txtPrice.Text +"数量:"+txtNum.Text +" "+cbxType.SelectedItem +"合计:" +totalPrices .ToString ());
            lblResult.Text =total .ToString ();

        }
    }
}

          大家通过这两段代码和我的描述应该对这两种模式有所了解了,理解的还不够深刻,希望大家多多指出!

时间: 2024-08-07 12:27:21

设计模式之简单模式与策略模式的相关文章

传统设计模式(一)策略模式

虫子以前在一家电商公司 会员的模块在这里分类很明确 不同的会员所具有的权限和行为不同,大多程序员会使用标准的oo技术,设计一个会员超类SuperUser,并让各种商家会员继承此超类 到这里无可厚非,但是在下面个过程中你可以就慢慢体会策略模式与你在代码里不停写逻辑判断所带来的区别有多大 所有的会员都具有下列行为 购物,评价,发布商品 public abstract class SuperUser { public SuperUser() { } public void shopping() { C

C++编程中使用设计模式中的policy策略模式的实例讲解_C 语言

   在看<C++设计新思维>的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的.policy,策略,方针,这里的意思是指把复杂功能的类尽量的拆分为功能单一的简单类的组合,简单的类只负责单纯行为或结构的某一方面.增加程序库的弹性,可复用性,可扩展性.policy是一个虚拟的概念,他定义了某一类class的一些接口规范,并不与C++语法的关键字对应,只是一个抽象的概念. 实例1: //policy模式的常见使用实

实例解析Ruby设计模式编程中Strategy策略模式的使用_ruby专题

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会.要帮什么忙呢?你很好奇. 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息的功能.他说会传递给你一个包含许多用户名的数组,你需要根据这些用户名把他们相应的数据都给查出来. 这个功能很简单的嘛,你爽快地答应了.由于你们项目使用的是MySQL数据库,你很快地写出了如下代码: require 'mysql' class QueryUtil def find_us

详解Java设计模式编程中的策略模式_java

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换.类型:行为类模式类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽

设计模式系列之六:策略模式

前言 策略模式是设计模式中的行为型模式,所谓行为型就是其主要使用在方法有很大灵活性的情况.而之前的工厂模式主要是对创建对象的优化,减少程序中使用new对象的次数.策略模式在Java源码中也是很常见的,比如我们要比较两个对象的大小,既可以使用默认的Comparable接口,也可以实现自定义的比较规则,即实现Comparator接口.这两种比较比较方法都是不同比较规则的体现,属于不同的策略.策略模式从定义上是这么说的:定义了算法家族,把这些不同的算法封装起来,让他们之间可以相互替换.从而使得算法的替

iOS应用运用设计模式中的Strategy策略模式的开发实例_IOS

  在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题.比如,一个验证输入数据的例程,数据本身可以是任何数据类型(如NSString.CGFloat等),每种数据类型需要不同的验证算法.如果能把每个算法封装成一个对象,那么就能消除根据数据类型决定使用什么算法的一堆if-else或switch-case语句.     我们把相关算法分离为不同的类,

C# 设计模式系列教程-策略模式_C#教程

在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接.2)打车过去.3)机场快轨+地铁 4)机场巴士 5)公交车 6)走路过去(不跑累死的话) 等等.使用方法,我们都可以达到从机场到XXX酒店的目的,对吧.那么我所列出的从机场到XXX酒店的的方法,就是我们可以选择的策略. 再举个例子,就是我们使用WCF时,往往避免不了对它进行扩展,例如授权,我们可以通过自定义授权来扩展WCF.这里我们可以通过自定义AuthorizationPol

学习JavaScript设计模式(策略模式)_javascript技巧

何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路.1.策略模式的定义 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选择骑自行车. 在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法. 定义:策略模式定义一系列的算法,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算饭的客户. 策略模式有着广泛的应用.本节

轻松掌握Java策略模式_java

定义:一个类的行为或其算法可以在运行时更改.在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 特点:     1.算法可以自由切换.     2.避免使用多重条件判断.     3.扩展性良好. 企业级开发和常用框架中的应用:java.servlet.http.HttpServlet的service方法 实例:对两个数的操作行为. public class Demo { public static v