您的位置:首页 > 运维架构

开闭原则(Open-Closed Principle)与Strategy模式

2006-09-01 20:38 363 查看
"开闭原则":
"开闭原则"是一种与类设计相关的原则.

"软件实体(类,模块,函数等)应该对扩展开放,而对修改关闭[Martin,p99]".

"开闭原则"有两个重要的方面:
1. "对扩展开放": 当应用程序的需求发生改变,可以通过扩展模块的行为来应对.
2. "对修改关闭": 扩展模块的行为并不会导致模块的源代码或它的二进制代码的修改.

在应用程序中有两种设计模式可以帮助实现"开闭原则": Template Method (模板方法模式)和 Strategy (策略模式). Template Method是通过继承来隐藏算法的细节,而Strategy是通过委托来隐藏算法的细节(通过接口的方式),从而获得"开闭原则"带来的好处.

.NET Framework中的Strategy模式的例子:
通过IComparer接口对ArrayList中的对象排序.默认情况下,ArrayList的Sort方法使用"快速排序"算法对实现了IComparable的每一项进行排序.然而,某些时候需要对列表排序使用不同的情况,所以有一个重载的Sort将IComparer作为参数.如果是默认情况,ArrayList使用IComparer.Compare做比较.如果传入实现了IComparer接口的对象,ArrayList能够实现其它的排序算法而不用关心比较方法的细节.

下面是Strategy设计模式的一个例子:


class CoolComparer : IComparer




...{




IComparer Members#region IComparer Members




public int Compare(object x, object y)




...{


// TODO: implementation


return 0;


}




#endregion




}






ArrayList items = new ArrayList();




items.Add("One");


items.Add("Two");


items.Add("Three");




items.Sort(); // Uses IComparable on string object




IComparer myComparer = new CoolComparer();


items.Sort(myComparer); // Delegate Comparison Method

上面显示如何支持"开闭原则",因为在ArrayList中实现一个新的比较方法来比较对象,而不需要对ArrayList类做修改.此即对修改来说是封闭的.而我们能够传递实现IComparer接口的对象,此即对扩展是开放的.扩展ArrayList只需要编写实现IComparer接口的新代码,而不用修改已有的代码.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: