在c#中实施策略模式是错误的

时间:2013-03-19 04:49:34

标签: c# strategy-pattern

我正在尝试使用嵌套类实现策略模式。

public class Restriction
{
    protected SpecificRestriction _specificRestriction;

    public void SetGreaterRestriction(decimal value)
    {
        Greater greaterRestriction = new Greater();
        greaterRestriction.GreaterValue = value;
        _specificRestriction = greaterRestriction;
    }

    public void SetLessRestriction(decimal value)
    {
        Less lessRestriction = new Less();
        lessRestriction.LessValue = value;
        _specificRestriction = lessRestriction;
    }

    public void SetRangeRestriction(decimal lessValue, decimal greaterValue)
    {
        Range r = new Range();
        r.GreaterValue= greaterValue;
        r.LessValue= lessValue;
        _specificRestriction = r;
    }

    public bool Eval(decimal Value2)
    { 
        return _specificRestriction.Eval(Value2);
    }


    /* Nested strategies classes */

    protected abstract class SpecificRestriction
    {     
        public abstract bool Eval(decimal Value);
    }

    protected class Less : SpecificRestriction
    {
        public decimal LessValue { get; set; }
        public override bool Eval(decimal lessValue)
        {
            return lessValue < LessValue ;
        }
    }

    protected class Greater : SpecificRestriction
    {
        public decimal GreaterValue { get; set; }
        public override bool Eval(decimal greaterValue)
        {
            return greaterValue > GreaterValue;
        }
    }

    protected class Range : SpecificRestriction
    {
        public decimal LessValue { get; set; }
        public decimal GreaterValue { get; set; }

        public override bool Eval(decimal mediumValue)
        {
            return LessValue <= mediumValue && mediumValue <= GreaterValue;
        }
    }
}

测试:

        Restriction r = new Restriction();

        r.SetLessRestriction(12);
        r.Eval(13)  // Return false   <- Works!
        r.Eval(11)  // Return True    <- Works!


        r.SetGreaterRestriction(12);
        r.Eval(13)     // Return True    <- Works!
        r.Eval(11)     // Return False   <- Works!

        r.SetRangeRestriction(12, 15);
        r.Eval(13)  // Return false     <- It does not works
        r.Eval(11)  // Return false     <- Works!
        r.Eval(16)  // Return false     <- Works!

为什么范围不起作用?我在Range类中做错了吗?

2 个答案:

答案 0 :(得分:0)

Restriction Class需要进行一些更改,它可以正常工作

  

公共类限制       {           protected SpecificRestriction _specificRestriction;

    public void SetGreaterRestriction(decimal value)
    {
        Greater greaterRestriction = new Greater();
        greaterRestriction.GreaterValue = value;
        _specificRestriction = greaterRestriction;
    }

    public void SetLessRestriction(decimal value)
    {
        Less lessRestriction = new Less();
        lessRestriction.LessValue = value;
        _specificRestriction = lessRestriction;
    }

    public void SetRangeRestriction(decimal lessValue, decimal greaterValue)
    {
        Range r = new Range();
        r.GreaterValue = greaterValue;
        r.LessValue = lessValue;
        _specificRestriction = r;
    }

    public bool Eval(decimal Value2)
    {
        return _specificRestriction.Eval(Value2);
    }


    /* Nested strategies classes */

    protected abstract class SpecificRestriction
    {
        public abstract bool Eval(decimal Value);
    }

    protected class Less : SpecificRestriction
    {
        public decimal LessValue { get; set; }
        public override bool Eval(decimal lessValue)
        {
            return lessValue < LessValue;
        }
    }

    protected class Greater : SpecificRestriction
    {
        public decimal GreaterValue { get; set; }
        public override bool Eval(decimal greaterValue)
        {
            return greaterValue > GreaterValue;
        }
    }

    protected class Range : SpecificRestriction
    {
        public decimal LessValue { get; set; }
        public decimal GreaterValue { get; set; }

        public override bool Eval(decimal mediumValue)
        {
            return LessValue <= mediumValue && mediumValue <= GreaterValue;
        }
    }
}

答案 1 :(得分:-1)

您的Range类不会覆盖Eval方法,它会覆盖Evaluar方法。