আমার একটি রয়েছে class Carযার 2 টি বৈশিষ্ট্য রয়েছে: int priceএবং boolean inStock। এটি একটি ঝুলিতে Listএর abstract class State(খালি বর্গ)। এখানে 2 টি রাজ্য রয়েছে যা গাড়িতে প্রয়োগ করা যেতে পারে এবং প্রত্যেকটির নিজস্ব শ্রেণি দ্বারা প্রতিনিধিত্ব করা হয়: class Upgrade extends Stateএবং class Shipping extends State।
এ Car2 টি রাজ্যের প্রতিটি সংখ্যক ধারণ করতে পারে। রাজ্যগুলির নিম্নলিখিত নিয়ম রয়েছে:
Upgrade:1নিজের পরে গাড়িতে প্রয়োগ করা প্রতিটি রাজ্যের জন্য দাম যুক্ত করে।Shipping: তালিকায় যদি কমপক্ষে 1 টিShippingরাষ্ট্র থাকে তবেinStockসেট করা আছেfalse।
উদাহরণস্বরূপ, price = 1এবং দিয়ে শুরু inStock = true:
add Shipping s1 --> price: 1, inStock: false
add Upgrade g1 --> price: 1, inStock: false
add Shipping s2 --> price: 2, inStock: false
add Shipping s3 --> price: 3, inStock: false
remove Shipping s2 --> price: 2, inStock: false
remove Upgrade g1 --> price: 1, inStock: false
remove Shipping s1 --> price: 1, inStock: false
remove Shipping s3 --> price: 1, inStock: true
আমি পর্যবেক্ষক প্যাটার্ন সম্পর্কে ভাবছিলাম যেখানে প্রতিটি অ্যাড এবং অপসারণ অপারেশনগুলি পর্যবেক্ষককে অবহিত করে। আমার মনে এই জাতীয় কিছু ছিল তবে এটি আমার দেওয়া নিয়মগুলি মানায় না:
abstract class State implements Observer {
public abstract void update();
}
class Car extends Observable {
List<State> states = new ArrayList<>();
int price = 100;
boolean inStock = true;
void addState(State state) {
if (states.add(state)) {
addObserver(state);
setChanged();
notifyObservers();
}
}
void removeState(State state) {
if (states.remove(state)) {
deleteObserver(state);
setChanged();
notifyObservers();
}
}
}
class Upgrade extends State {
@Override
public void update(Observable o, Object arg) {
Car c = (Car) o;
int bonus = c.states.size() - c.states.indexOf(this) - 1;
c.price += bonus;
System.out.println(c.inStock + " " + c.price);
}
}
class Shipping extends State {
@Override
public void update(Observable o, Object arg) {
Car c = (Car) o;
c.inStock = false;
System.out.println(c.inStock + " " + c.price);
}
}
স্পষ্টতই, এটি কাজ করে না। যখন একটি Shippingসরানো হয়, কোনও কিছুতে অন্য কোনও রাষ্ট্রের inStockমিথ্যা হিসাবে সেট করা আছে কিনা তা পরীক্ষা করে দেখতে হয় , সুতরাং অপসারণ Shippingকেবল তা করতে পারে না inStock = true। প্রতিটি কল এ Upgradeবৃদ্ধি price। আমি তখন ডিফল্ট মানগুলির জন্য ধ্রুবকগুলি যুক্ত করেছিলাম এবং সেগুলির উপর ভিত্তি করে পুনরায় গণনার চেষ্টা করেছি।
আমি কোনওভাবেই কোনও নিদর্শন চাপানোর চেষ্টা করছি না, আমি কেবল উপরের প্রয়োজনীয়তার জন্য একটি সমাধান খুঁজতে চাইছি। নোট করুন যে অনুশীলনে Carঅনেক সম্পত্তি রয়েছে এবং এমন অনেকগুলি রাজ্য রয়েছে যা এই পদ্ধতিতে প্রয়োগ করা যেতে পারে। আমি এটি করার কয়েকটি উপায় সম্পর্কে ভেবেছিলাম:
- যেহেতু প্রতিটি পর্যবেক্ষক প্রাপ্ত হন
Car, এটি বর্তমানে নিবন্ধিত অন্যান্য সমস্ত পর্যবেক্ষকের দিকে নজর রাখতে পারে এবং তার ভিত্তিতে পরিবর্তন আনতে পারে। আমি জানি না যে এটি পর্যবেক্ষককে এভাবে জড়িয়ে ফেলতে স্মার্ট কিনা। - যখন কোনও পর্যবেক্ষক যুক্ত করা হয় বা এতে সরানো হয়
Car, তখন পুনরায় গণনা হবে। যাইহোক, এই পুনরায় গণনাটি কেবলমাত্র যুক্ত করা / অপসারণের ক্ষেত্রে নির্বিশেষে সকল পর্যবেক্ষকদের জন্যই করতে হবে। - একটি বাহ্যিক "ম্যানেজার" ক্লাস করুন যা অ্যাডকে কল করবে এবং পদ্ধতিগুলি মুছে ফেলবে এবং পুনঃ গণনা করবে।
বর্ণিত আচরণ বাস্তবায়নের জন্য একটি ভাল ডিজাইনের ধরণ কী এবং এটি কীভাবে কাজ করবে?