設計モードの単純モードとポリシーモード


最近,単純な工場モデルと戦略モデルを学習する際,彼らには多くの共通点があることが分かった.彼らは多態によって異なるサブクラスの選択を実現し,比較的見分けがつかないので,まとめた.
単純工場モードは、例えばアルゴリズムの加減乗除、果物のリンゴ梨バナナ、文房具のペン尺に用いられる.これらの例の共通の特徴は具体的で、数量が限られており、複雑なアルゴリズムには関係なく、単純工場モードはオブジェクトの作成問題を解決しただけで、工場クラスにはすべての選択過程がパッケージされている.オブジェクトが増加し、減少し、変化する場合、コードの書き換え量が増大するように工場を変更し、操作中にお客様は工場にパラメータを指定する必要があります.工場はパラメータに従ってインスタンス化が必要な派生クラスを選択します.単純なファクトリモードでは、お客様は抽象ベースクラスとファクトリクラスを知る必要があります.ファクトリクラスはオブジェクトを生成するために使用され、抽象ベースクラスのインタフェースを使用して作業を完了します.その核心は「単純モードはすべてのオブジェクトをカプセル化するために使用されます」です.
簡単な工場モデルの例を次に示します.
       
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 ();
            
        }
    }
}
皆さんはこの2つのコードと私の説明を通じてこの2つのモードについて理解しているはずです.理解がまだ深くありません.多くの指摘をしてください.