2013-04-10 43 views
0

我正在写一个算法,它可以在一些系列上工作,并执行一些操作,比如移位,以及与之相关的操作。我想用两种不同的数据结构来测试算法:MutableBigInteger和BitString(javabdd),所以我想我会试着想出一些聪明的设计模式(因为我不这么做),我发现策略设计模式很有趣。唯一困扰我的是对于函数AND,它需要计算相同的类型。我有一些代码解释:策略设计模式(使用参数方法) - JAVA

论文是我的两个不同的类:

public class MutableBigInteger { 

public void shift(); 
public void and(MutableBigInteger b2){ 
    // ... 
} 
} 


public class BitString { 

public void shift(); 
public void and(BitString b2){ 
    // ... 
    } 
} 

我希望做一个设计,这样在我的类创建它执行算法我只是这些类之间进行选择。该算法是这样的:

while(...) { 
    bittrain.shift(); 
    bittrain.and(bittrain2); 
} 

这个问题对我来说是如何实现与功能,并且由于每个我自己的类中等待说法同一类。我想我会喜欢这样的:

public interface BitTrain { 

public void shift(); 
public void and(BitTrain b2); 

}

和我的两个班,这个接口扩展,但它并没有真正帮助我,因为在MutableBigInteger和BITSTRING我会做一个投,我不是很想要(因为速度)。

希望我已经说得够好了,祝你有美好的一天!

尼科

+0

我建议修正标题,因为您的问题更多的是接口,继承和泛型,而不是关于战略模式。 – 2013-04-10 07:15:48

回答

3

不要以为这是最干净的方式,但你可以使用泛型:

public interface BitTrain<T extends BitTrain<?>> { 
    public void shift(); 
    public void and(T b2); 
} 

,然后实现类似的界面:

public class MutableBigInteger implements BitTrain<MutableBigInteger> { 
    public void shift(); 
    public void and(MutableBigInteger b2){ 
     // ... 
    } 
} 
+0

这不适用于不同类型的bittrains,因为'和()'只有同一类的参数除外。由于通配符不匹配,您无法将它们全部视为Bittrains。我添加了一个可以工作的答案。 – 2013-04-10 07:25:21

+0

@Plantface我读这个问题的方式,OP不希望结合不同的bittrain实现... – 2013-04-10 07:29:12

+0

@Heuster是的,它是一个工作的解决方案,也许不是最干净的,但我想也许是最快的...?在任何情况下,我有效=)问:我真的要把BitTrain >或BitTrain 就够了。它只是为了让实现扩展bittrain,但它不是必需的,对吧? – Nikkolasg 2013-04-10 08:38:18

0

这听起来像过早优化给我。你确定checkcast字节码会影响你的整体性能吗?我认为这属于“HotSpot可以做到”。

+0

也许是这样,我不确定,但在我看来,它比多态技术慢,我需要做这些操作很多,所以我真的需要尽可能快的方式。 – Nikkolasg 2013-04-10 08:36:10

0

我没有完全理解这个问题,但你任何机会思考模板模式

public class MyBitOperation<T> { 

T b1; 

public MyBitOperation(T b) { 
    b1= b; 
} 
public void shift(){ 

//TODO: DO something 
} 
public void and(T b2){ 

    //Do somehting else 
} 
+0

是的,这是我想要做的,但事情是在我的功能之一(除了换挡或“和”),我不得不称呼“新”,我不能用泛型类型... – Nikkolasg 2013-04-10 08:34:48