首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >想好要使用哪种设计模式?

想好要使用哪种设计模式?
EN

Stack Overflow用户
提问于 2017-12-04 03:42:27
回答 4查看 103关注 0票数 1

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

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

代码语言:javascript
运行
复制
class RadioDevice {
    void demodulate (String m) {
        if(m.equals("FM")
            /* FM modelation */
        else if(m.equals("AM")
            /* AM modelation */
    }
}

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

EN

回答 4

Stack Overflow用户

发布于 2017-12-04 03:51:22

为什么不使用多态性呢?

创建一个接口:

代码语言:javascript
运行
复制
interface Radio {
   void modulate();
}

然后实现两个类:

代码语言:javascript
运行
复制
FMRadio implements Radio{

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

AMRadio implements Radio{

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

然后,在你的主体中,你可以这样说:

代码语言:javascript
运行
复制
Radio myRadio = new FMRadio();
myRadio.demodule();
票数 7
EN

Stack Overflow用户

发布于 2017-12-04 03:55:32

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-12-04 04:04:23

为了使它成为一个合适的策略模式,我将在前面@Ladislav_M的回答中添加使用Context类,它将包装和封装执行特定策略,并为代码提供更大的灵活性:

代码语言:javascript
运行
复制
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中执行将变得更加方便:

代码语言:javascript
运行
复制
Context context = new Context(new FmRadio());
Object result = context.runStrategy();

或者你可以内联上面的代码:

代码语言:javascript
运行
复制
Object result = (new Context(new FmRadio())).runStrategy();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47622493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档