在我正在进行的类库中,我需要实现一种机制,通过对Issuer类进行操作,类用户将获得一个项目:
class Issuer {
public Item GetItem () {
return queue.Pop ();
}
}
//at some other place
var item = issuer.GetItem ();
//work on item and submit back to Issuer
如何实施这种模式,最大限度地降低班级用户甚至不愿意将其提交回来的风险?
我的偏好顺序是:
我知道这不是一个非常明确的问题,但上面实施的任何建议/设计模式都会有所帮助!
答案 0 :(得分:2)
维护已发布项目的集合,可能存储它们的发布时间以及发布它们的类。这样您就不必显式重新提交该项目。 重新提交显然从已发布的集合中删除。然后,如果已发布的集合中仍有项目,则可以选择基于“脏”数据以多种方式抛出异常。 你可以:
我要说的一件事可能是查看静态发行者而不是将其作为实例方法。
答案 1 :(得分:2)
这样做的一种方法是使用IDisposable
接口。这样,用户可以在使用期间利用using
语句:
using (var item = issuer.GetItem())
{
// Work on item
} // Item is released on Dispose()
发行人可以简单地听一个事件来取回物品。但是,如果物品被传递,它可能不是你最好的选择。在这种情况下,一个简单的Close()
或Release()
方法(再次让发行者监听一个事件)可能就是这样做的。
在大多数情况下,用户最好以某种方式明确释放获得的项目。
如果某些不重要的用户省略了释放项目,您可以随时使用标准的Dispose模式返回 Finalizer 。但是,您必须非常小心不要复活该项目(在完成后保留参考)。
答案 2 :(得分:2)
听起来IDisposable可能在这里很有用。怎么样:
class Item { }
class Issuer: IDisposable
{
Queue<Item> queue = new Queue<Item>();
List<Item> deliveredItems = new List<Item>();
public Item GetItem()
{
Item item = queue.Dequeue();
deliveredItems.Add(item);
return item;
}
public void SubmitItem(Item item)
{
deliveredItems.Remove(item);
// do some operation here
}
public void Dispose()
{
foreach (Item item in deliveredItems)
{
SubmitItem(item);
}
}
}
class Issuer: IDisposable
{
Queue<Item> queue = new Queue<Item>();
List<Item> deliveredItems = new List<Item>();
public Item GetItem()
{
Item item = queue.Dequeue();
deliveredItems.Add(item);
return item;
}
public void SubmitItem(Item item)
{
deliveredItems.Remove(item);
// do some operation here
}
public void Dispose()
{
foreach (Item item in deliveredItems)
{
SubmitItem(item);
}
}
}
一旦您的发卡行处理,每个尚未提交的交付物品将自动提交。
答案 3 :(得分:-1)
使用某个事件让发卡人知道某个项目已被获取并使用某个事件将其传回发卡行。
贝