Template Method 在一个方法中实现一个算法,但是推迟定义算法中的某些步骤,从而使其他的类可以重新定义这些步骤
一个经典实例 - 排序

 自定义类
自定义类1
 using System;
using System;2

3
 namespace Gof.Test.TemplateMethod
namespace Gof.Test.TemplateMethod4


 {
{5
 public class User
    public class User6

 
     {
{7
 public User(string name,int age)
        public User(string name,int age)8

 
         {
{9
 _name = name;
            _name = name;10
 _age = age;
            _age = age;11
 }
        }12
 public string Name
        public string Name13

 
         {
{14
 get
            get15

 
             {
{16
 return _name;
                return _name;17
 }
            }18
 set
            set19

 
             {
{20
 _name = value;
                _name = value;21
 }
            }22
 }
        }23
 private string _name;
        private string _name;24
 public int Age
        public int Age25

 
         {
{26
 get
            get27

 
             {
{28
 return _age;
                return _age;29
 }
            }30
 set
            set31

 
             {
{32
 _age = value;
                _age = value;33
 }
            }34
 }
        }35
 private int _age;
        private int _age;36

37
 }
    }38
 }
}
 自定义排序类
自定义排序类1
 private class MyCustomCompare:System.Collections.IComparer
        private class MyCustomCompare:System.Collections.IComparer2

 
         {
{3

 IComparer 成员#region IComparer 成员
            IComparer 成员#region IComparer 成员4

5
 public int Compare(object x, object y)
            public int Compare(object x, object y)6

 
             {
{7
 User userx = (User)x;
                User userx = (User)x;8
 User usery = (User)y;
                User usery = (User)y;9
 int result = 0;
                int result = 0;10
 if(userx.Age > usery.Age)
                if(userx.Age > usery.Age)11

 
                 {
{12
 result = -1;
                    result = -1;13
 }
                }14
 if(userx.Age == usery.Age)
                if(userx.Age == usery.Age)15

 
                 {
{16
 result = 0;
                    result = 0;17
 }
                }18
 if(userx.Age < usery.Age)
                if(userx.Age < usery.Age)19

 
                 {
{20
 result = 1;
                    result = 1;21
 }
                }22
 return result;
                return result;23
 }
            }24

25
 #endregion
            #endregion 26
 }
        }
 客户代码
客户代码1
 User user = new User("nan",20);
            User user = new User("nan",20);2
 User user2 = new User("shou",19);
            User user2 = new User("shou",19);3
 User user3 = new User("yong",18);
            User user3 = new User("yong",18);4

 User[] users = new User[]
            User[] users = new User[] {user,user2,user3};
{user,user2,user3};5
 Array.Sort(users,new MyCustomCompare());
            Array.Sort(users,new MyCustomCompare());6
 foreach(User u in users)
            foreach(User u in users)7

 
             {
{8
 Console.WriteLine(u.Name);
                Console.WriteLine(u.Name);9
 }
            }10
 Console.ReadLine();
            Console.ReadLine();
 Machine类层次
Machine类层次1
 using System;
using System;2
 using Gof.Test.Factory.Plan;
using Gof.Test.Factory.Plan;3

4
 namespace Gof.Test.Factory.Machines
namespace Gof.Test.Factory.Machines5


 {
{6
 public class Machine
    public class Machine7

 
     {
{8
 public Machine()
        public Machine()9

 
         {
{10
 }
        }11
 public bool HasDone
        public bool HasDone12

 
         {
{13
 get
            get14

 
             {
{15
 return _hasDone;
                return _hasDone;16
 }
            }17
 set
            set18

 
             {
{19
 _hasDone = value;
                _hasDone = value;20
 }
            }21
 }private bool _hasDone;
        }private bool _hasDone;22

23
 public virtual MachinePlanner CreatePlanner()
        public virtual MachinePlanner CreatePlanner()24

 
         {
{25
 return new BasicPlanner(this);
            return new BasicPlanner(this);26
 }
        }27
 public MachinePlanner GetPlanner()
        public MachinePlanner GetPlanner()28

 
         {
{29
 if(_planner == null)
            if(_planner == null)30

 
             {
{31
 _planner = CreatePlanner();//这里是多态的
                _planner = CreatePlanner();//这里是多态的32
 }
            }33
 return _planner;
            return _planner;34
 }private MachinePlanner _planner;  //抽象出来,形成模板
        }private MachinePlanner _planner;  //抽象出来,形成模板35
 }
    }36
 }
}
 Fuser
Fuser1
 using System;
using System;2
 using Gof.Test.Factory.Plan;
using Gof.Test.Factory.Plan; 3

4
 namespace Gof.Test.Factory.Machines
namespace Gof.Test.Factory.Machines5


 {
{6
 public class Fuser:Machine
    public class Fuser:Machine7

 
     {
{8
 public Fuser()
        public Fuser()9

 
         {
{10
 }
        }11
 public override MachinePlanner CreatePlanner()
        public override MachinePlanner CreatePlanner()12

 
         {
{13
 return new FuserPlanner(this);
            return new FuserPlanner(this);14
 }
        }15
 //        private MachinePlanner GetPlanner()
//        private MachinePlanner GetPlanner()16
 //        {
//        {17
 //            if(_planner == null)
//            if(_planner == null)18
 //            {
//            {19
 //                _planner = new FuserPlanner(this);
//                _planner = new FuserPlanner(this);20
 //            }
//            }21
 //            return _planner;
//            return _planner;22
 //        }private MachinePlanner _planner;//重构掉了
//        }private MachinePlanner _planner;//重构掉了23
 }
    }24
 }
}25


 Mixer
Mixer1
 using System;
using System;2
 using Gof.Test.Factory.Plan;
using Gof.Test.Factory.Plan;3

4

5
 namespace Gof.Test.Factory.Machines
namespace Gof.Test.Factory.Machines6


 {
{7
 public class Mixer : Machine
    public class Mixer : Machine8

 
     {
{9
 public Mixer()
        public Mixer()10

 
         {
{11
 }
        }12
 public override MachinePlanner CreatePlanner()
        public override MachinePlanner CreatePlanner()13

 
         {
{14
 return new MixerPlanner(this);
            return new MixerPlanner(this);15
 }
        }16
 //        private MachinePlanner GetPlanner()
//        private MachinePlanner GetPlanner()17
 //        {
//        {18
 //            if(_planner == null)
//            if(_planner == null)19
 //            {
//            {20
 //                _planner = new MixerPlanner(this);
//                _planner = new MixerPlanner(this);21
 //            }
//            }22
 //            return _planner;
//            return _planner;23
 //        }private MachinePlanner _planner;
//        }private MachinePlanner _planner;24
 }
    }25
 }
}
 MachinePlanner类层次
MachinePlanner类层次1
 using System;
using System;2
 using Gof.Test.Factory.Machines;
using Gof.Test.Factory.Machines;3

4
 namespace Gof.Test.Factory.Plan
namespace Gof.Test.Factory.Plan5


 {
{6
 public abstract class MachinePlanner
    public abstract class MachinePlanner7

 
     {
{8
 public MachinePlanner(Machine machine)
        public MachinePlanner(Machine machine)9

 
         {
{10
 _machine = machine;
            _machine = machine;11
 }
        }12
 public Machine Machine
        public Machine Machine13

 
         {
{14
 get
            get15

 
             {
{16
 return _machine;
                return _machine;17
 }
            }18
 }
        }19
 private Machine _machine;
        private Machine _machine;20
 public abstract bool ContineWork
        public abstract bool ContineWork21

 
         {
{22
 get;
           get;23
 }
        }24
 }
    }25
 }
}
 BasicPlanner
BasicPlanner1
 using System;
using System;2
 using Gof.Test.Factory.Machines;
using Gof.Test.Factory.Machines;3

4
 namespace Gof.Test.Factory.Plan
namespace Gof.Test.Factory.Plan5


 {
{6
 public class BasicPlanner:MachinePlanner
    public class BasicPlanner:MachinePlanner7

 
     {
{8
 public BasicPlanner(Machine machine) : base(machine)
        public BasicPlanner(Machine machine) : base(machine)9

 
         {
{10
 }
        }11
 public override bool ContineWork
        public override bool ContineWork12

 
         {
{13
 get
            get14

 
             {
{15
 return Machine.HasDone;
                return Machine.HasDone;16
 }
            }17
 }
        }18
 }
    }19
 }
}
 FuserPlanner
FuserPlanner1
 using System;
using System;2
 using Gof.Test.Factory.Machines;
using Gof.Test.Factory.Machines;3

4
 namespace Gof.Test.Factory.Plan
namespace Gof.Test.Factory.Plan5


 {
{6

 /**//// <summary>
    /**//// <summary>7
 /// FuserPlanner 的摘要说明。
    /// FuserPlanner 的摘要说明。8
 /// </summary>
    /// </summary>9
 public class FuserPlanner:MachinePlanner
    public class FuserPlanner:MachinePlanner10

 
     {
{11
 public FuserPlanner(Machine machine):base(machine)
        public FuserPlanner(Machine machine):base(machine)12

 
         {
{13
 }
        }14
 public override bool ContineWork
        public override bool ContineWork15

 
         {
{16
 get
            get17

 
             {
{18
 return Machine.HasDone;
                return Machine.HasDone;19
 }
            }20
 }
        }21
 }
    }22
 }
}
 MixerPlanner
MixerPlanner1
 using System;
using System;2
 using Gof.Test.Factory.Machines;
using Gof.Test.Factory.Machines;3

4
 namespace Gof.Test.Factory.Plan
namespace Gof.Test.Factory.Plan5


 {
{6
 public class MixerPlanner : MachinePlanner
    public class MixerPlanner : MachinePlanner7

 
     {
{8
 public MixerPlanner(Machine machine) : base(machine)
        public MixerPlanner(Machine machine) : base(machine)9

 
         {
{10
 }
        }11
 public override bool ContineWork
        public override bool ContineWork12

 
         {
{13
 get
            get14

 
             {
{15
 return Machine.HasDone;
                return Machine.HasDone;16
 }
            }17
 }
        }18

19
 }
    }20
 }
}.jpg) 
  
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号