-------------------------Update-----------------------------------------------
Thanks to Thies Heidecke. I've partially get it done. Two implementations return same result in first several steps. However, the implementation in functional way always stops earlier than OOP style. How to solve that?
gmQuadraticF[A_, b_, x0_, eps_, iter_] :=
Module[
{x, g, \[Alpha], NormG, f, v, path},
x = x0;
g = A.x + b;
v = 1/2 x0.A.x0 + b.x0;
\[Alpha] = N[ (Norm[g]^2)/g.A.g];
NormG = Norm[g];
f[step_, \[Alpha]_, x_, g_, sqaureNormG_, v_] := {
step + 1,(*update Iteration counts*)
N[Norm[g]^2/g.A.g],(*\[Alpha] step size*)
x - N[Norm[g]^2/g.A.g]*g,(*update x*)
A.(x - N[Norm[g]^2/g.A.g]*g) + b, (*update gradient*)
Norm[A.(x - N[Norm[g]^2/g.A.g]*g) + b],(*update gradient norm*)
1/2 (x - N[Norm[g]^2/g.A.g]*g).A.(x - N[Norm[g]^2/g.A.g]*g) +
b.(x - N[Norm[g]^2/g.A.g]*g)(*object function value*)};
path = NestWhileList[
f[#[[1]], #[[2]], #[[3]], #[[4]], #[[5]], #[[6]]] &, {0, \[Alpha],
x, g, NormG, v}, #[[1]] <= iter && #[[5]]^2 >= eps &];
Prepend[
path, {"Iteration", "Step Size", "X", "Gradient", "Gradient Norm",
"Object Value"}] // TableForm
]