2012-10-10 108 views
1

众所周知,类继承是“开放”类型 - 分区和歧视联盟是“封闭”类型 - 分区。但是,虽然添加新的子类很容易,但添加新的虚拟函数需要修改所有现有的类。同时,受歧视的工会可以轻松添加新的功能。用于扩展歧视联盟的“设计模式”

   | inheritance | discriminated union 
new type  | easy  | hard 
new function | hard  | easy 

OOP已经有足够的,我们所经历的困难,“添加新的方法,以一种层次结构”,并在情况下,“修改中的所有类”是不是一个好的选择,我们来到与Visitor模式之类的东西一起为现有类型添加新功能。

例如:

class Base  Base.f() Base.g() 
class A : Base A.f()  A.g() 
class B : Base B.f()  B.g() 

由于添加虚拟Base.h()是困难的,我们使用访问者模式,因此将来的功能可以被封装。 这基本上是模式匹配函数的基于继承的模拟!

class H : BaseVisitor { 
    visit(A) { } 
    visit(B) { } 
} 
// this looks really similar to: 
let H something = 
    match something with 
    | A -> .. 
    | B -> .. 

TLDR:是否有与添加类型为区分联合涉及一个常见的抽象(类似访问者模式)?

回答

0

如果我正确理解你的问题,我会争取桥牌模式。它可以让您独立于实现来改变接口/抽象,从而在结构上具有灵活性。但是,我从来没有必要使用桥接模式。

希望有帮助:D