3
void accept(CarElementVisitor *visitor) {
        visitor->visit(this);
    }
}

ここでは、操作を追加する関数にオブジェクトを渡しています。ここでは、カプセル化に違反しています。それは良いオブジェクト指向設計ですか?

4

2 に答える 2

3

Visitorはアクセスされているオブジェクトの内部構造を知らないため、これがカプセル化に違反しているとは思いません。

あなたの車の例では、Car オブジェクトは 4 つの車輪とガソリン エンジンを備えていることを認識していますが、訪問者はデータの保存方法ではなく、何を伝えているかしか知りません。

void accept(CarElementVisitor *visitor) {

    visitor->visit(wheel_1);
    visitor->visit(wheel_2);
    visitor->visit(wheel_3);
    visitor->visit(wheel_4);

    visitor->visit(gasEngine);
}

後で、訪問者の訪問呼び出しを変更せずに Car オブジェクトの実装を変更できます。

void accept(CarElementVisitor *visitor) {
    //wheels now stored in array

    visitor->visit(wheels[0]);
    visitor->visit(wheels[1]);
    visitor->visit(wheels[2]);
    visitor->visit(wheels[3]);

    visitor->visit(gasEngine);
}
于 2013-08-27T17:54:17.793 に答える