ฉันมี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
ถ้ามีอย่างน้อย 1Shipping
ของรัฐในรายการแล้วมีการตั้งค่า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
จะมีการคำนวณใหม่ อย่างไรก็ตามการคำนวณใหม่นี้จะต้องทำกับผู้สังเกตการณ์ทุกคนโดยไม่คำนึงถึงผู้ที่เพิ่งเพิ่ม / ลบออก - มีคลาส "ผู้จัดการ" ภายนอกซึ่งจะเรียกวิธีการเพิ่มและลบและทำการคำนวณใหม่
รูปแบบการออกแบบที่ดีในการใช้พฤติกรรมที่อธิบายไว้คืออะไรและทำงานอย่างไร