我正在编写二叉树作为学习练习的一部分。我试图适应在二叉树中删除节点的两种方法:DeleteByMerge 和 DeleteByCopy。
为用户提供在这些方法之间进行选择的最佳方式是什么?
我倾向于组合方法(如策略):
public class BinaryTree{
BtreeDelete del;
public BinaryTree(){
this.del = new DeleteByCopy();
}
public BinaryTree(BtreeDelete del){
this.del = del;
}
public boolean delete(Node node){
// Common code
del.delete()
}
}
DeleteByMerge 和 DeleteByCopy 类实现了 BtreeDelete 接口,所以我可以在实例化过程中像这样连接:
BinaryTree btree = new BinaryTree(new DeleteByMerge());
或者
BinaryTree btree = new BinaryTree(new DeleteByCopy());
.
基于继承的方法:
public class BinaryTree{
public BinaryTree(){
}
public boolean delete(Node node){
// Common code
deleteNode();
}
// An overriddable hook with a default implementation
protected boolean deleteNode(Node node){
//By default implementation for DeleteByCopy is provided
}
}
删除的不同实现将需要一个单独的子类(导致类的可能爆炸):
public class BtreeDelByMerge extends BinaryTree{
protected boolean deleteNode(Node node){
// Code for deleting a node by Merging
}
}
我对 Inheritance 方法的疑虑是 BtreeDelByMerge 不是 Btree 的一种类型,它的行为并没有太大变化,并且只为它的一个方法创建一个单独的子类似乎不自然。如果我想要一棵具有特定插入和删除等实现的树,它也不会像组合方法那样倾向于。
在这种情况下,继承方式有什么特别的优势吗?此外,提供选择是否是个好主意?例如:Collections 框架没有提供太多的选择,因此实现很好地封装和一致但死板。