不知道大家有没有注意到ArrayList类有一个静态方法Readonly它只有一个类型为ArrayList的参数,并且返回值也是一个ArrayList,他的作用是返回某个ArrayList实例的只读版本。我把类似完成这种功能的一种设计称作Readonly Version模式。不知道有没有别人提出过,如果没有就是我第一个提出,^_^
该模式的应用场景:
类在某些应用场合不能修改成员值,即某些时候需要获得类实例的只读版本
实现要点:
1. ClassA有一个静态方法Readonly;此静态方法有一个ClassA的参数并返回该类型;
2. ClassA有一个私有的内嵌类ReadonlyClassA,从ClassA继承,ReadonlyClassA有一个只有一个参数为ClassA的构造函数。
3. ReadonlyClassA重写所有方法,对于不改变实例成员值得方法,直接返回值,而对于会改变成员值得方法抛出NotSupportException异常
其实现的类图:
代码实现:
public class ClassA
{
public static ClassA Readonly(ClassA instance)
{
return new ReadonlyClassA(instance);
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
private class ReadonlyClassA : ClassA
{
private ClassA _classA;
public ReadonlyClassA(ClassA classA)
{
_classA = classA;
}
public override string Name
{
get
{
return _classA.Name;
}
set
{
throw new NotSupportedException("不支持指定操作。");
}
}
}
}
{
public static ClassA Readonly(ClassA instance)
{
return new ReadonlyClassA(instance);
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
private class ReadonlyClassA : ClassA
{
private ClassA _classA;
public ReadonlyClassA(ClassA classA)
{
_classA = classA;
}
public override string Name
{
get
{
return _classA.Name;
}
set
{
throw new NotSupportedException("不支持指定操作。");
}
}
}
}
优点:
可以隐藏只读版本类的实现,而对外统一了只读版本和一般类的接口
缺点:
…….
第一次写设计模式的文章,那儿不对的请各位指正。