如果您有一个包含状态变量的类和两个需要访问它并以异步方式操作的成员类。实现这个的最佳方法是什么?
一个例子
public enum RestaurantState
{
BREAKFAST,
LUNCH,
DINNER
}
public class Restaurant
{
//Below need access to state
private DeliveryMan pizzaDriver ;
private Supplier butcherShop ;
internal RestaurantState state ;
}
public DeliveryMan
{
//Uses a System.Timers.Timer
//Wakes up and does work every a minute
//Needs to inform state of restaurant
}
public Supplier
{
//Waits and listens for requests to accept deliveries
//If suppliers run out we need to change the restaurant state based on our own current state
}
这些类以异步方式运行。 DeliveryMan和Supplier类都需要能够读/写状态。 DeliveryMan推出餐厅的状态,供应商会听取供应商的状态。
是否有更好的方法来设计此方法或以最小的耦合实现它,而不向DeliveryMan或供应商提供其所有者餐厅的参考。
答案 0 :(得分:2)
我会将状态作为构造函数参数传递给您的两个内部类,并且考虑到它是一个引用类型,它也可以被修改。
答案 1 :(得分:1)
也许您可以在需要更新状态时触发的DeliveryMan
和Supplier
类上创建事件。在调用事件处理程序时,餐厅可以订阅这些事件并相应地更新自己的状态。
答案 2 :(得分:1)
如果RestaurantState
是或者可以成为一个持有状态而不是状态本身的对象,那么你可以像@Davide一样回答并将其传递给构造函数。
但是,如果它是类似enum
的值类型,那么我认为event
是可行的方法。
DeliveryMan
使用新状态引发事件,Restaurant
侦听并更新其内部状态。
Restaurant
可以在状态发生变化时在StateChanged
上调用Supplier
方法或类似方法。或者Supplier
可以使用特殊event
或RestaurantStateEventArgs
可以收听的内容提升Restaurant
,并使用州填充事件参数。
根据用例的不同,只要引用Restaurant
即使它确实紧密耦合也可能并不可怕。
修改:实际上,如果DeliveryMan
和Supplier
需要访问RestaurantState
,那么它们已经与某些餐馆有关联,所以除非你有更通用的类型“状态”比RestaurantState
他们已经耦合了。
有时候退一步看看是否很好
a)解耦实际上在特定场景中很有用 b)你所做的事情是否实际上已经解耦到足够有用。
在这种情况下,您仍然无法重复使用DeliveryMan
和Supplier
作为家具店。
作为旁注:
OPEN,
CLOSED,
LOW_ON_SUPPLIES
这些并不是枚举的最佳选择,因为它们并非全部互斥。如果它是一个类,可能会更好:
public class RestaurantState
{
public bool IsOpen { get; set; }
public bool IsLowOnSupplies { get; set; }
}
在这种情况下,@ Davide将RestaurantState传递给DeliveryMan
和Supplier
的构造函数的答案效果很好。
答案 3 :(得分:0)
我会把这个州带出餐馆班,然后做一个StateManager
课程,这是其他课程的单身人士或工厂。很难给出一个更完整的答案,因为你的OO设计不会给你带来太大的影响。
var restaurant = new Restaurant();
var supplier = new Supplier();
StateManager.GetState(restaurant);
StateManager.GetState(supplier);
答案 4 :(得分:0)
我会创建一个Order
类,其中包含您在另一个类中需要的信息。还可以使用您在Timer事件上检查的队列。当您将订单出列时,请查看Order.State(例如)。使用Enqueue和Dequeue方法将Queue放入公共静态类中。
当DeliveryMan计时器事件触发时,将订单出列。
你提到一切都是异步的,所以你可以查看ConcurrentQueue。由于Supplier等待通知,您可以使用IObserver / IObservable向带有序列化Order对象的Supplier发送流消息...
只是一些可能会有所帮助的想法。