乍看起来,不能修改而可以扩展似乎是自相矛盾的。怎么可以同时又不修改、而又可扩展呢?在开始讨论之前,不妨考察一下《西游记》中,玉皇大帝在美猴王的挑战之下,是怎样维护天庭的秩序的。
玉帝招安闰猴王
当年大帝天宫时的美猴王便是玉帝天庭的新挑战。美猴王说:“‘皇帝轮流做,明年到我家。’只教他搬出去,将天宫让与我!”对于这项挑战,太白金星给玉皇大帝提出的建议是:“臣启陛下。。。降一道招安圣旨,把他宣来上界。。。与他籍名在箓。。。一则不动众劳师,二则收仙有道也。”
换言之,不劳师动众、不破坏天规便是“闭”,收仙有道便是“开”。招安之法便是玉帝天庭的“开-闭”原则,通过给美猴王一个“弼马温”的官职,便可使现有系统满足变化了的需求,而不必更改天庭的既有秩序,如下图所未。
招安之法的关键便是不允许更改现有的天庭秩序,但允许将娇儿纳入现有的秩序中,从而扩展了这一秩序。用面向对象的语言来讲,允许更改的是系统的抽象层,而允许扩展的是系统的实现层。
《太玄》论“固革”
西汉杨雄的《太玄》一书说:“知固而不知革,物失其则;知革而不知固,物失其均。”
一个系统对修改关闭,就是《太玄》所说的“固”;而系统对扩展开发,就是《太玄》所说的“革”。一个系统不可扩展,就是“物失其则”,或者说系统推动使用的价值;而一个系统动辄需要修改,便会“物失其均”,也就是失去重心。
因此,“开-闭”原则非常接近《太玄》一书所说的“固革”原则。
抽象化是关键
解决问题的关键在于抽象化。在像java语言这样的面向对象的编程语言里面,可以给系统宣言出一个一劳永逸、不再更改的抽象设计,此设计允许有无穷无尽的行为在实现层被实现。在java语言里,可以给出一个或多个抽象java类或java接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需修改,从而满足了“开-闭”原则的第二条,对修改关闭。
同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了“开-闭”原则的第一条。关于在java语言中实现抽象化的方法,请阅读后面的“专题:java接口”一章和“专题:抽象类”一章。
转载自:IT连载在线。[url]http://www.zaixianzazhi.com/lz/ms/20110322/78.html[/url]
玉帝招安闰猴王
当年大帝天宫时的美猴王便是玉帝天庭的新挑战。美猴王说:“‘皇帝轮流做,明年到我家。’只教他搬出去,将天宫让与我!”对于这项挑战,太白金星给玉皇大帝提出的建议是:“臣启陛下。。。降一道招安圣旨,把他宣来上界。。。与他籍名在箓。。。一则不动众劳师,二则收仙有道也。”
换言之,不劳师动众、不破坏天规便是“闭”,收仙有道便是“开”。招安之法便是玉帝天庭的“开-闭”原则,通过给美猴王一个“弼马温”的官职,便可使现有系统满足变化了的需求,而不必更改天庭的既有秩序,如下图所未。
招安之法的关键便是不允许更改现有的天庭秩序,但允许将娇儿纳入现有的秩序中,从而扩展了这一秩序。用面向对象的语言来讲,允许更改的是系统的抽象层,而允许扩展的是系统的实现层。
《太玄》论“固革”
西汉杨雄的《太玄》一书说:“知固而不知革,物失其则;知革而不知固,物失其均。”
一个系统对修改关闭,就是《太玄》所说的“固”;而系统对扩展开发,就是《太玄》所说的“革”。一个系统不可扩展,就是“物失其则”,或者说系统推动使用的价值;而一个系统动辄需要修改,便会“物失其均”,也就是失去重心。
因此,“开-闭”原则非常接近《太玄》一书所说的“固革”原则。
抽象化是关键
解决问题的关键在于抽象化。在像java语言这样的面向对象的编程语言里面,可以给系统宣言出一个一劳永逸、不再更改的抽象设计,此设计允许有无穷无尽的行为在实现层被实现。在java语言里,可以给出一个或多个抽象java类或java接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需修改,从而满足了“开-闭”原则的第二条,对修改关闭。
同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了“开-闭”原则的第一条。关于在java语言中实现抽象化的方法,请阅读后面的“专题:java接口”一章和“专题:抽象类”一章。
转载自:IT连载在线。[url]http://www.zaixianzazhi.com/lz/ms/20110322/78.html[/url]