同时,在等待question上的答复时,我想讨论可能的实施计划/细节,或者一般地回答实现以下内容有多难,以及为此需要哪些工具/技术:
(摘自上述问题):
假设您需要实现许多(子)类型的集合。其中一个方面是storage-related:列表、数组等,而另一个方面是behavior-related:排序、只删除、可观察的(在每次更改时触发事件的)等等。
显然(再次),需求直接映射到众所周知的Decorator设计模式,其中与存储相关的方面(列表、数组)将由多个行为(有序、可观察等)来修饰。
到目前为止,我想用(类似于Java的)伪代码提出一些相当短的实现,同时询问是否可以用Java或C#实现以下内容,如果没有,则用任何其他现代编程语言实现:
每个集合必须支持的基本接口:
interface Collection {
[mutator]
public void add(object o);
[mutator]
public void remove(object o);
[accessor]
public object get(int i);
}存储方面:
清单执行情况:
class List : Collection {
[mutator]
public void add(object o) { ... }
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}数组实现:
class Array : Collection {
[mutator]
public void add(object o) { ... }
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}行为方面:
线程安全装饰器:
typename<T> : where T is Collection
class ThreadSafe : Collection {
private T m_source;
private object m_lock = new object();
[mutator]
public void add(object o) {
using (m_lock) {
m_source.add();
}
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}可观察的装潢师:
class ChangeEvent {
public Collection Source { get; private set; }
public Method UpdateType { get; private set; }
}
interface Observer {
public notifyChange(ChangeEvent e);
}
typename<T> : where T is Collection
class Observable : Collection {
public Observer Observer { get; set; } // additional property
private T m_source;
[mutator]
public void add(object o) {
if (Observer != null) {
var event = new ChangeEvent() { Source = this, UpdateType = GetCurrentMethod() };
Observer.notifyChange(event);
}
m_source.add(o);
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}定购装潢师:
typename<T> : where T is Collection
class Ordered : Collection {
private T m_source;
[mutator]
public void add(object o) {
int idx = findProperPosition(); // assumed possible using the base Collection interface
...
m_source.add(o);
}
[mutator]
public void remove(object o) { ... }
[accessor]
public object get(int i) { ... }
}只读装饰师:
typename<T> : where T is Collection
class ReadOnly : Collection {
private T m_source;
[mutator]
public void add(object o) { throw IllegalOperationException(...); }
[mutator]
public void remove(object o) { throw IllegalOperationException(...); }
[accessor]
public object get(int i) { return m_source.get(i); }
}到目前为止,上面的只是伪代码,但目标是使客户端代码能够构造多种集合,这样每种代码都可以将任意数量的behavior-related方面的存储方面组合在一起。如果能够在编译时构造这些组合类型,并且能够在运行时生成这些类型,那就太好了。
问题是(任何现代编程语言都是如何计算的)?
发布于 2011-10-08 03:27:59
我不明白你是怎么不明白的。Java集合已经具备了这个功能,并且源代码是公共的。有用于线程安全和不可修改的装饰器。而且,许多类型都有"asList()“之类的such方法。
既然如此,你的问题还剩下什么?
如何制作没有订购的东西?例如,如何创建一个将HashMap转换为LinkedHaskMap的装饰器?可以使用内部数据结构来构建这样的装饰器来维护秩序。
https://stackoverflow.com/questions/3133176
复制相似问题