मेरे पास class Car
2 गुण हैं: int price
और boolean inStock
। यह भी एक धारण List
की abstract class State
(खाली वर्ग)। 2 राज्य हैं जिन्हें कार पर लागू किया जा सकता है और प्रत्येक को अपनी स्वयं की कक्षा द्वारा दर्शाया गया है: class Upgrade extends State
और class Shipping extends State
।
A Car
प्रत्येक 2 राज्यों में से किसी भी संख्या को पकड़ सकता है। राज्यों के निम्नलिखित नियम हैं:
Upgrade
:1
प्रत्येक राज्य के लिए कार के लिए लागू मूल्य के बाद खुद को कहते हैं।Shipping
: यदिShipping
सूची में कम से कम 1 राज्य है, तो इसके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
, तो एक पुनर्गणना होगी। हालाँकि, इस पुनर्गणना को सभी पर्यवेक्षकों पर ध्यान दिए बिना करना होगा जो अभी जोड़ा / हटाया गया था। - एक बाहरी "प्रबंधक" वर्ग है जो जोड़ने और हटाने के तरीकों को बुलाएगा और पुनर्गणना करेगा।
वर्णित व्यवहार को लागू करने के लिए एक अच्छा डिजाइन पैटर्न क्या है और यह कैसे काम करेगा?