模板方法

模板方法例子如下,还是计算器为例。

   public enum Operator { Add,Sub,Mul,Div}
 public abstract class CalTemplate
    {
        public abstract Operator Operator { get; }
        public abstract List<decimal> Parameters { get; }
        public virtual decimal Calculate()
        {
            switch (Operator)
            {
                case Operator.Add:
                    return Parameters.Aggregate((x, y) => x + y);
                case Operator.Sub:
                    return Parameters.Aggregate((x, y) => x - y);
                case Operator.Mul:
                    return Parameters.Aggregate((x, y) => x * y);
                case Operator.Div:
                    return Parameters.Aggregate((x, y) => x / y);
                default:
                    throw new ArgumentNullException(nameof(Operator));
            }
        }
    }
    public class AddConcrete : CalTemplate
    {
        private List<decimal> _data;
        public AddConcrete(params decimal[] data)
        {
            _data = data.ToList();
        }
        public override Operator Operator => Operator.Add;

        public override List<decimal> Parameters => _data;
    }
        CalTemplate template = new AddConcrete(1, 2, 3, 4, 5);
            var result = template.Calculate();
            Trace.WriteLine(result);

上面只展示了add的实例。

总结:

这个例子跟策略模式很像,只不过策略模式是抽象了对象的行为,而这个模式是把一组抽象行为通过一定规则做了顺序执行。 都是行为模式,一个是一个对象的行为,一个是一个对象的N个行为做了排版吧。策略模式是通过委托来解决问题,模板是通过继承来解决问题。

到这里其实还可以联想到建造者模式,只不过一个是对对象的排版,一个是对行为的排版。

 

posted @ 2022-11-17 18:47  星仔007  阅读(18)  评论(0编辑  收藏  举报