确定要使用哪种设计模式?

时间:2017-12-03 19:42:27

标签: java design-patterns software-design

在大多数无线电设备中,我们可以使用与此类型兼容的解调模式配置我们想要探索和监听电台的波。

AM和FM至少有两种类型。在这种情况下,我们可以将无线电设备建模如下:

class RadioDevice {
    void demodulate (String m) {
        if(m.equals("FM")
            /* FM modelation */
        else if(m.equals("AM")
            /* AM modelation */
    }
}

在这种情况下如何应用策略模式?

4 个答案:

答案 0 :(得分:7)

为什么不使用多态?

制作界面:

interface Radio {
   void modulate();
}

而不是实现2个类:

FMRadio implements Radio{

    public void demodule(){
      //FM modulation
    }
}

AMRadio implements Radio{

    public void demodule(){
      //AM modulation
    }
}

而且,在你的主力,你可以去:

Radio myRadio = new FMRadio();
myRadio.demodule();

答案 1 :(得分:1)

如果你有一个涵盖AM和FM解调合同的接口,你可以使用策略模式:

Demodulator d; // interface Demodulator { byte[] demodulate(); }
switch(m) {
    case "AM":
        d = new AMDemodulator();
        break;
    case "FM"
        d = new FMDemodulator();
        break;
    default:
        throw new IllegalArgumentException("Unsupported type '"+ m + "'"); // you could use an Enum instead of a String
}
d.demodulate(waves);

这允许您动态切换Demodulator部分,同时保持程序逻辑的其余部分(没有重复)。

检查此回购(不是我的)设计模式和示例:https://github.com/iluwatar/java-design-patterns

答案 2 :(得分:0)

为了使它成为一个正确的策略模式,我会使用Context类添加到@Ladislav_M的上一个答案,它将包装&封装执行特定策略并为代码提供更大的灵活性:

class Context {
    private Radio radio;

    public Context(Radio radio) {
        this.radio = radio;
    }

    public Object runStrategy() {
        radio.demodulate();
        // do any other stuff you want
        return ...
    }
}

main中的执行会变得更方便:

Context context = new Context(new FmRadio());
Object result = context.runStrategy();

或者你可以内联上述内容:

Object result = (new Context(new FmRadio())).runStrategy();

当然,您可以在Radio块中选择switch的实现,并将其作为变量传递给Context的构造函数。

答案 3 :(得分:0)

这是不是战略设计模式的好用例,它的简单继承案例。策略用于,其中对象的状态不会改变,但不同的算法适用于不同的时间。例如针对员工不同角色的薪酬计算(例如临时,永久等)。重要的一点是临时员工有一天可以成为永久员工。

在上述情况下,AM的生命周期永远不会成为FM 。因此战略不是正确的模式。这些(可能)是不同的类,具有共同的行为(如果存在)可以转移到基类。如果他们与客户展示共同合同,那么即使是界面也可以完成任务。