The state pattern seems to be a decent fit. You could model each of the nodes in your system as states.
To start with, your Object would be:
public class Object
{
public string Color { get; set; }
public int Weight { get; set; }
public int Size { get; set; }
private NodeState _state;
public NodeState State { get { return _state; } set { _state = value; _state.Handle(); } }
}
The business logic of checking color, weight, etc. would sit in the corresponding states. Node1 would look like:
public class Node1 : NodeState
{
private readonly Object ctx;
public Node1(Object ctx)
{
this.ctx = ctx;
}
public void Handle()
{
if (ctx.Color.Equals("Red"))
ctx.State = new Node2(ctx);
else
ctx.State = new Node3(ctx);
}
}
To start with, you'll create the Object and set an initial state to it.
var obj = new Object(){Color = "Red", Weight = 10, Size = 5};
obj.State = new Node1(obj);
Passing the whole object to the Node maybe a smell. Instead, you could even pass in an interface.
The only down-side I see with this approach is some sort of class explosion. There may be as many classes as there are nodes.
However, the design would be quite extensible - in the sense you could add more nodes if required, in line with OCP (Open-closed principle).