Tôi có một class Car
trong đó có 2 thuộc tính: int price
và boolean inStock
. Nó cũng chứa một List
số abstract class State
(lớp trống). Có 2 tiểu bang có thể được áp dụng trên xe và mỗi tiểu bang được đại diện bởi lớp riêng của nó: class Upgrade extends State
và class Shipping extends State
.
A Car
có thể giữ bất kỳ số nào của mỗi trong số 2 trạng thái. Các tiểu bang có các quy tắc sau:
Upgrade
: thêm1
vào giá cho mỗi tiểu bang áp dụng cho xe sau đó.Shipping
: nếu có ít nhất 1Shipping
trạng thái trong danh sách, thìinStock
được đặt thànhfalse
.
Ví dụ: bắt đầu bằng price = 1
và 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
Tôi đã suy nghĩ về mẫu người quan sát trong đó mỗi thao tác thêm và xóa thông báo cho người quan sát. Tôi đã có một cái gì đó như thế này trong đầu, nhưng nó không tuân theo các quy tắc tôi đặt ra:
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);
}
}
Rõ ràng, điều này không làm việc. Khi a Shipping
bị xóa, một cái gì đó phải kiểm tra xem có cài đặt trạng thái nào khác thành inStock
false không, vì vậy việc loại bỏ Shipping
không thể inStock = true
. Upgrade
tăng price
ở mỗi cuộc gọi. Sau đó tôi đã thêm các hằng số cho các giá trị mặc định và thử tính toán lại dựa trên các giá trị đó.
Tôi hoàn toàn không cố gắng áp đặt bất kỳ khuôn mẫu nào, tôi chỉ đang cố gắng tìm một giải pháp cho các yêu cầu trên. Lưu ý rằng trong thực tế Car
có chứa nhiều thuộc tính và có nhiều trạng thái có thể được áp dụng theo cách này. Tôi đã nghĩ về một vài cách để làm điều này:
- Vì mỗi người quan sát nhận được
Car
, nó có thể xem xét tất cả các nhà quan sát khác hiện đang đăng ký và thực hiện thay đổi dựa trên điều đó. Tôi không biết liệu có thông minh khi vướng vào những người quan sát như thế này không. - Khi một người quan sát được thêm hoặc xóa trong
Car
đó, sẽ có một tính toán lại. Tuy nhiên, việc tính toán lại này sẽ phải được thực hiện trên tất cả các nhà quan sát bất kể cái nào vừa được thêm / xóa. - Có một lớp "trình quản lý" bên ngoài sẽ gọi các phương thức thêm và xóa và thực hiện tính toán lại.
Một mẫu thiết kế tốt để thực hiện hành vi được mô tả là gì và nó sẽ hoạt động như thế nào?