What is the difference between Strategy pattern and Visitor Pattern?

后端 未结 11 1604
灰色年华
灰色年华 2021-01-29 22:18

I have trouble understanding these two design patterns.

Can you please give me contextual information or an example so I can get a clear idea and be able to map the dif

11条回答
  •  甜味超标
    2021-01-29 22:28

    I see strategy pattern as a way to inject a method/strategy into an object, but typically the signature of that method takes some value params and returns a result so it's not coupled with the user of the strategy: From Wikipedia :

    class Minus : ICalculateStrategy {
        public int Calculate(int value1, int value2) {
            return value1 - value2;
        }
    }
    

    Visitor instead is coupled with the user through double dispatch and typically keeps state. Good example here, I'll just copy from there:

    public class BlisterPack
    {
        // Pairs so x2
        public int TabletPairs { get; set; }
    }
    
    public class Bottle
    {
        // Unsigned
        public uint Items { get; set; }
    }
    
    public class Jar
    {
        // Signed
        public int Pieces { get; set; }
    }
    
    public class PillCountVisitor : IVisitor
    {
        public int Count { get; private set; }
    
        #region IVisitor Members
    
        public void Visit(BlisterPack blisterPack)
        {
            Count += blisterPack.TabletPairs * 2;
        }
    
        public void Visit(Bottle bottle)
        {
            Count += (int) bottle.Items;
        }
    
        public void Visit(Jar jar)
        {
            Count += jar.Pieces;
        }
    
        #endregion
    }
    
    public class BlisterPack : IAcceptor
    {
        public int TabletPairs { get; set; }
    
        #region IAcceptor Members
    
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    
        #endregion
    }
    

    As you can see the visitor has state(public int Count) and it operates on a list of know types BlisterPack, Bottle, Jar. So if you want to support a new type you need to change all visitors by adding that type.

    Also it's coupled with the types it operates on because of "visitor.Visit(this);". What would happen if I remove or change the "Items" property form bottle? ... all visitors would fail.

提交回复
热议问题