开闭原则(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接口的新代码,而不用修改已有的代码.
"开闭原则"是一种与类设计相关的原则.
"软件实体(类,模块,函数等)应该对扩展开放,而对修改关闭[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接口的新代码,而不用修改已有的代码.
相关文章推荐
- 设计模式6大原则之开闭原则(Open Close Principle)
- 设计模式六大原则——开闭原则(OCP,Open Close Principle)
- 设计模式六大原则(6)开闭原则(Open Close Principle)
- "围观"设计模式(6)--开闭原则(Open/Closed Principle)
- 设计模式六大原则(6):开闭原则OCP(The Open/Closed Principle )
- C#设计模式系列:开闭原则(Open Close Principle)
- "围观"设计模式(6)--开闭原则(Open/Closed Principle)
- 设计模式六大设计原则之开闭原则(Open Close Principle)
- [设计模式原则]开闭原则(Open - ClosedPrinciple, OCP)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 策略模式(Strategy) 1
- 二十四种设计模式:策略模式(Strategy Pattern)
- Java 设计模式--策略(Strategy)
- 设计模式08-策略模式Strategy(对象行为模式)
- javascript策略模式(strategy)
- 设计模式初探2:几个原则:单一职责、开闭原则、依赖倒转原则
- 奇幻RPG(角色技能 与 Strategy模式)
- 设计模式简单代码之Strategy模式
- Strategy(策略模式)