随笔 - 103  文章 - 2 评论 - 919 trackbacks - 21
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456


转载请保留链接。
国际管理VS中国国情链接 8-21 13:48

与我联系

搜索

 

常用链接

留言簿(12)

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

最新随笔

积分与排名

  • 积分 - 146166
  • 排名 - 248

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

不知道大家有没有注意到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("不支持指定操作。");
                }

            }

        }

}


优点:

可以隐藏只读版本类的实现,而对外统一了只读版本和一般类的接口

 

缺点:

…….

 

第一次写设计模式的文章,那儿不对的请各位指正。

posted on 2007-04-09 08:45 玉开 阅读(2144) 评论(21)  编辑 收藏 所属分类: 软件设计.Net开发经验设计模式

FeedBack:
#1楼  2007-04-09 08:57 改一 [未注册用户]
第一次听说这种模式,能否算一种模式呢?
  回复  引用    
#2楼 [楼主] 2007-04-09 08:58 玉开      
@改一
如果大家有用到的地方就可以算一种模式,个人观点,呵呵
  回复  引用  查看    
#3楼  2007-04-09 09:03 alanding [未注册用户]
增长见识^_^
  回复  引用    
#4楼  2007-04-09 09:03 t-mac [未注册用户]
我觉得这算不上是一种模式

你这里的应用跟 System.Collections.Hashtable 的 Synchronized方法是一样的
  回复  引用    
#5楼 [楼主] 2007-04-09 09:06 玉开      
@t-mac
在.netframework中ArrayList和hashTable两个类都是用的这种实现方法,我也不敢说可以算是一种模式,如果大家在用的时候能想起来这种方法用就可以。

而且ArrayList这个类的实现中有好几个内嵌类用来实现这种类似的机制。
  回复  引用  查看    
#6楼  2007-04-09 09:15 T-MAC.NET      
应该是装饰模式吧
  回复  引用  查看    
#7楼  2007-04-09 09:20 Jeffrey Zhao      
作为模式似乎简单了些,呵呵。
  回复  引用  查看    
#8楼 [楼主] 2007-04-09 09:24 玉开      
@T-MAC.NET
实现确实和装饰模式差不多,不过不同的地方在于它隐藏了ReadonlyVersionClass的声明


  回复  引用  查看    
#9楼 [楼主] 2007-04-09 09:24 玉开      
@Jeffrey Zhao
模式不怕简单,有用武之地就好,呵呵
  回复  引用  查看    
#10楼  2007-04-09 10:48 亚历山大同志      
恭喜博主推出自己的模式!
  回复  引用  查看    
#11楼  2007-04-09 10:51 lxw [未注册用户]
不可变模式
  回复  引用    
#12楼  2007-04-09 10:54 lxw [未注册用户]
java与模式中有讨论
  回复  引用    
#13楼 [楼主] 2007-04-09 11:03 玉开      
@lxw
哦,我没看过java与模式,看来需要补课了。
  回复  引用  查看    
#14楼 [楼主] 2007-04-09 11:04 玉开      
@亚历山大同志
不能算我的了,其实有很多地方都在用。
  回复  引用  查看    
#15楼  2007-04-09 11:26 Clark Zheng      
虽然不是发明,但总结的不错 :)
  回复  引用  查看    
#16楼  2007-04-09 11:30 Jeffrey Zhao      
@玉开
感觉不是所有的使用方式都能叫做模式的阿,呵呵。
  回复  引用  查看    
#17楼 [楼主] 2007-04-09 11:46 玉开      
@Jeffrey Zhao
叫不叫模式的就不管了,叫也好不叫也罢,如果大家能够在处理类似问题的时候想到这个既有的成熟的设计方式就好了。

之所以说成熟的,是因为微软的类库中用到了,还有一位朋友说java与模式中也提到了。

呵呵,感谢你的关注,老赵,我也姓赵
  回复  引用  查看    
#18楼  2007-04-09 13:05 亚历山大同志      
@玉开
所谓模式就是总结出来的成熟的套路,所以无所谓发明,谁总结出来就行了
  回复  引用  查看    
#19楼  2007-04-09 14:13 kevinshan [未注册用户]
不错不错,善于发现和总结。在设计的时候大家以前不知道有这种方式的现在相当于补习了一下,管他是不是模式了?用的人多了,也就成了模式。
  回复  引用    
#20楼 [楼主] 2007-04-09 14:30 玉开      
@kevinshan
呵呵,赞同你的观点
  回复  引用  查看    
#21楼  2007-04-10 10:18 xiao_p      
这种说法java里面不是早就有了吗。
effective java里面就提到过
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-15 11:08 编辑过