【问题标题】:Strategy Design Pattern (with argument method) - JAVA策略设计模式(带参数方法)- JAVA
【发布时间】:2013-04-10 15:27:58
【问题描述】:

我正在编写一种算法,该算法适用于位系列并执行一些操作,例如移位和与它一起。我想用两种不同的数据结构来测试算法:MutableBigInteger 和 BitString (javabdd),所以我想我会尝试一些聪明的设计模式(因为我不经常这样做),我找到了策略设计图案很有趣。唯一困扰我的是对于函数 AND,它需要计算相同的类型。我用一些代码解释:

这些是我的两个不同的课程:

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);
}

我的问题是如何使用函数 AND 来实现这一点,因为我自己的每个类都在参数中等待同一个类。我想我会喜欢这个:

public interface BitTrain {

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

}

并用这个接口扩展我的两个类,但它并没有真正帮助我,因为在 MutableBigInteger 和 BitString 中我将不得不做一个演员,我真的不想要那个(因为速度)。

希望我已经解释得很好,祝你有个美好的一天!

尼哥

【问题讨论】:

  • 我建议更正标题,因为您的问题更多是关于接口、继承和泛型,而不是关于策略模式。

标签: java design-patterns strategy-pattern


【解决方案1】:

不要认为这是最干净的方法,但您可以使用泛型:

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){
        // ...
    }
}

【讨论】:

  • 这不适用于不同类型的 bittrain,因为 and() 仅排除同一类的参数。由于通配符不匹配,您也不能将它们全部视为 Bittrains。我添加了一个可行的答案。
  • @Plantface 我阅读问题的方式,OP不想结合不同的位列车实现......
  • @Heuster 是的,它是一个可行的解决方案,可能不是最干净的,但我认为可能是最快的......?无论如何,我有效 =) 问题:我真的必须放 BitTrain> 或 BitTrain 就足够了..?这只是为了让 sur 实现扩展 bittrain,但这不是必需的,对吧?
  • @Nikkolasg 就是这样 :) 但既然你想让T 扩展BitTrain(我认为),明确说明也没有什么坏处
  • 酷,是的,你是对的,我会说的。我不习惯“?”泛型类中的符号这就是原因,但它没有伤害。
【解决方案2】:

对我来说,这听起来像是过早的优化。您确定checkcast 字节码会对您的整体性能产生如此大的影响吗?我认为这属于“HotSpot 可以做到这一点”。

【讨论】:

  • 也许是这样,我不确定,但在我看来,它比多态性技术要慢,而且我需要做很多这些操作,所以我真的需要尽可能快的方法。跨度>
【解决方案3】:

我没有完全理解这个问题,但是你是否有机会考虑模板模式

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
}

【讨论】:

  • 是的,这就是我想要做的,但事情在我的一个功能中(除了 shift 或“and”)我必须调用“new”,我不能用通用的输入...