আমি জাভা, যেখানে প্রতিটি টুকরা নিজস্ব প্রকার (ভালো হয় (যেমন দাবা হিসাবে) একটি বোর্ড খেলা তৈরি করছি Pawn
, Rook
ইত্যাদি)। অ্যাপ্লিকেশনটির জিইউআই অংশের জন্য আমার এই টুকরোটির প্রতিটি জন্য একটি চিত্র দরকার। যেহেতু করছেন মত করে
rook.image();
ইউআই এবং ব্যবসায়িক যুক্তির বিচ্ছেদ লঙ্ঘন করে, আমি প্রতিটি টুকরোর জন্য একটি পৃথক উপস্থাপক তৈরি করব এবং তারপরে টুকরার প্রকারগুলি তাদের সম্পর্কিত উপস্থাপকদের মতো ম্যাপ করব will
private HashMap<Class<Piece>, PiecePresenter> presenters = ...
public Image getImage(Piece piece) {
return presenters.get(piece.getClass()).image();
}
এ পর্যন্ত সব ঠিকই. যাইহোক, আমি বোধ করি একটি বিচক্ষণ ওওপি গুরু কোনও getClass()
পদ্ধতি কল করার সময় ভ্রান্ত হবে এবং উদাহরণস্বরূপ দর্শনার্থীর ব্যবহারের পরামর্শ দিবে:
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;
}
}
আমি এই সমাধানটি পছন্দ করি (গুরু, আপনাকে ধন্যবাদ) তবে এর একটি উল্লেখযোগ্য কমতি রয়েছে। প্রতিবার অ্যাপ্লিকেশনটিতে একটি নতুন টুকরো টাইপ যুক্ত করা হলে পিসভিভিটরটিকে একটি নতুন পদ্ধতিতে আপডেট করতে হবে। আমি আমার সিস্টেমটিকে বোর্ড গেমের কাঠামো হিসাবে ব্যবহার করতে চাই যেখানে সাধারণ প্রক্রিয়াটির মাধ্যমে নতুন টুকরো যুক্ত করা যায় যেখানে কাঠামোর ব্যবহারকারী কেবল টুকরা এবং উপস্থাপক উভয়ই প্রয়োগ করতে পারে এবং কেবল এটিকে ফ্রেমওয়ার্কে প্লাগ করতে পারে। আমার প্রশ্ন: সেখানে ছাড়া একটি পরিষ্কার গলি সমাধান instanceof
, getClass()
ইত্যাদি যা extensibility এই ধরনের জন্য অনুমতি দেবেন?