6
オブジェクトをプレゼンターにマッピングするクリーンなOOP方法
私は、それぞれの作品は、独自のタイプ(のようであるジャワ、中(例えばチェスなど)ボードゲームを作成していますPawn、Rookなど)。アプリケーションのGUI部分では、これらの各部分の画像が必要です。やることは rook.image(); UIとビジネスロジックの分離に違反しているため、作品ごとに異なるプレゼンターを作成し、作品タイプを対応するプレゼンターにマッピングします。 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } ここまでは順調ですね。ただし、getClass()メソッドを呼び出すと慎重なOOPの第一人者が眉をひそめ、次のようなビジターを使用することをお勧めします。 class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 私はこのソリューションを気に入っています(ありがとう、第一人者)が、1つの重大な欠点があります。新しいピースタイプがアプリケーションに追加されるたびに、PieceVisitorを新しいメソッドで更新する必要があります。私のシステムをボードゲームフレームワークとして使用して、フレームワークのユーザーがピースとそのプレゼンターの両方の実装のみを提供し、それをフレームワークにプラグインするだけの簡単なプロセスで新しいピースを追加できるようにします。私の質問:このような拡張性を可能にするinstanceof、getClass()などのないクリーンなOOPソリューションはありますか?