设计模式 - 立面是否利用了开闭原则?



关于开闭原则的维基百科页面(截至今天2013-02-27)说它是通过继承实现的。

名称Open/Closed Principle有两种用法。两种方法都使用继承来解决明显的困境,但是目标、技术和结果是不同的。

"两种方式"指的是Meyer的实现继承和更常见的多态扩展。

无论如何,我的问题是关于farade模式的,它不使用继承。既然它以简化接口的形式定义了一个抽象到一个更复杂的子系统(或库),难道这不能被看作是开闭原则吗?更具体地说:

子系统(或库)为扩展对使用farade的客户端开放,其接口对修改关闭。

或者我只是扩展了信息隐藏的边界(这非常接近OCP,特别是如果你认为它是受保护的变化)。

不,Facade模式处理的关注点与OCP不同。虚包只是一个类,它为其他一些类充当前台。Facade将其客户端与它所面向的类中的更改隔离开来,但这不是OCP。OCP是关于单个类如何响应需求变化而变化。没有任何关于Facade的设置来引导这些更改。如果客户对Facade的需求发生变化,那么Facade也会发生变化。如果Facade处理的任何类以Facade关心的方式发生了变化,那么Facade也会这样做。

可以想象一个遵循OCP的Facade版本——也许是这样一个Facade,它与客户端的接口是一个接口或抽象类,对修改是封闭的,但可以扩展以适应新的需求——事实上,我一直以这种方式实现Facade,但这不是Facade的经典描述的一部分。

最新更新