在类及其成员之间共享变量

时间:2011-10-10 16:46:45

标签: c# oop class-design

如果您有一个包含状态变量的类和两个需要访问它并以异步方式操作的成员类。实现这个的最佳方法是什么?

一个例子

 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或供应商提供其所有者餐厅的参考。

5 个答案:

答案 0 :(得分:2)

我会将状态作为构造函数参数传递给您的两个内部类,并且考虑到它是一个引用类型,它也可以被修改。

答案 1 :(得分:1)

也许您可以在需要更新状态时触发的DeliveryManSupplier类上创建事件。在调用事件处理程序时,餐厅可以订阅这些事件并相应地更新自己的状态。

答案 2 :(得分:1)

如果RestaurantState是或者可以成为一个持有状态而不是状态本身的对象,那么你可以像@Davide一样回答并将其传递给构造函数。

但是,如果它是类似enum的值类型,那么我认为event是可行的方法。

DeliveryMan使用新状态引发事件,Restaurant侦听并更新其内部状态。

然后,

Restaurant可以在状态发生变化时在StateChanged上调用Supplier方法或类似方法。或者Supplier可以使用特殊eventRestaurantStateEventArgs可以收听的内容提升Restaurant,并使用州填充事件参数。

根据用例的不同,只要引用Restaurant即使它确实紧密耦合也可能并不可怕。

修改:实际上,如果DeliveryManSupplier需要访问RestaurantState,那么它们已经与某些餐馆有关联,所以除非你有更通用的类型“状态”比RestaurantState他们已经耦合了。

有时候退一步看看是否很好

a)解耦实际上在特定场景中很有用    b)你所做的事情是否实际上已经解耦到足够有用。

在这种情况下,您仍然无法重复使用DeliveryManSupplier作为家具店。

作为旁注:

OPEN,
CLOSED,
LOW_ON_SUPPLIES

这些并不是枚举的最佳选择,因为它们并非全部互斥。如果它是一个类,可能会更好:

public class RestaurantState
{
  public bool IsOpen { get; set; }
  public bool IsLowOnSupplies { get; set; }
}

在这种情况下,@ Davide将RestaurantState传递给DeliveryManSupplier的构造函数的答案效果很好。

答案 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发送流消息...

只是一些可能会有所帮助的想法。