मेरे पास class Car2 गुण हैं: 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, तो एक पुनर्गणना होगी। हालाँकि, इस पुनर्गणना को सभी पर्यवेक्षकों पर ध्यान दिए बिना करना होगा जो अभी जोड़ा / हटाया गया था। - एक बाहरी "प्रबंधक" वर्ग है जो जोड़ने और हटाने के तरीकों को बुलाएगा और पुनर्गणना करेगा।
वर्णित व्यवहार को लागू करने के लिए एक अच्छा डिजाइन पैटर्न क्या है और यह कैसे काम करेगा?