forked from AmazingCode/DesignModel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1、策略模式.cs
98 lines (93 loc) · 2.44 KB
/
1、策略模式.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
/// <summary>
/// 什么是策略模式?
/// 策略模式就是在简单工厂模式的基础上,对factory内部同时封装具体的子类的方法实现,
/// 但是策略模式和工厂模式 还是没从根本上消除switch语句
/// </summary>
class 策略模式
{
public void Main()
{
var c = new Context_Cl("1");
c.GetResult(1,6);//这里调用相对于简单工厂模式就更加统一了
}
}
abstract class Operat_Cl
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public virtual double GetResult()
{
return 0;
}
}
class Add_Cl:Operat_Cl
{
public Add_Cl(double numberA, double numberB)
{
}
public Add_Cl()
{}
public override double GetResult()
{
return NumberA+NumberB;
}
}
class Sub_Cl:Operat_Cl
{
public override double GetResult()
{
return NumberA-NumberB;
}
}
class Context_Cl
{
public Operat_Cl oper { get; set; }
public Context_Cl(string flag)
{
switch (flag)
{
case "1":
oper=new Add_Cl();
break;
case "2":
oper=new Sub_Cl();
break;
default:;
break;
}
}
public void GetResult(double numberA,double numberB)
{
oper.NumberA = numberA;
oper.NumberB = numberB;
oper.GetResult();
}
}
#region 可以改进Context_CL类,感觉像是策略模式了。不过无所谓,合理即可
abstract class Context_Fac
{
public abstract Operat_Cl GetObject();
public abstract double GetResult(double numberA,double numberB);
}
class Sub_Fac:Context_Fac
{
private Operat_Cl operatCl;
public override Operat_Cl GetObject()
{
return operatCl=new Sub_Cl();
}
public override double GetResult(double numberA,double numberB)
{
operatCl.NumberA=numberA;
operatCl.NumberB = numberB;
return operatCl.GetResult();
}
}
#endregion
}