【问题标题】:Implementing adapter pattern实现适配器模式
【发布时间】:2016-03-25 01:08:42
【问题描述】:

这些是我的 .java 类。我是否正确实现了适配器模式?

界面播放

public interface Play {

  public void Tune(String Type,String Guitar);

}

advanceTuning 界面

public interface AdvanceTuning {

  public void getSharp(String Guitar);
  public void getLowKey(String Guitar);

}

lowkeytuning.java

public class LowKeyTuning implements AdvanceTuning{

@Override
public void getSharp(String Guitar) {
    // TODO Auto-generated method stub

}

@Override
public void getLowKey(String Guitar) {
    // TODO Auto-generated method stub
    System.out.println(Guitar+": Guitar Tuned to LowKey");
}

}

Guitar.java

 public class Guitar implements Play{

Adapter adapter;
@Override
public void Tune(String Type, String Guitar) {
    // TODO Auto-generated method stub
    if(Type.equalsIgnoreCase("Standard")){
        System.out.println(Guitar+": Guitar Tuned to Standard");
    }
    else if(Type.equalsIgnoreCase("Sharp") || Type.equalsIgnoreCase("LowKey")){

        adapter=new Adapter(Type);
        adapter.Tune(Type, Guitar);
    }
    else{
        System.out.println("No Such Tuning exists as "+Type);
    }
}   
}

Adapter.java

public class Adapter implements Play{

AdvanceTuning aTune;

public Adapter(String Type){

    if(Type.equalsIgnoreCase("Sharp")){

        aTune= new SharpTuning();
    }
    else if(Type.equalsIgnoreCase("LowKey")){
        aTune= new LowKeyTuning();
    }
}

@Override
public void Tune(String Type,String Guitar) {
    // TODO Auto-generated method stub
    if(Type.equalsIgnoreCase("Sharp")){
        aTune.getSharp(Guitar);
    }
    else if(Type.equalsIgnoreCase("LowKey")){
        aTune.getLowKey(Guitar);
    }
}
}

SharpTuning.java 与 Lowkey.java 相同

我有一个 client.java 类,它创建一个 Guitar.java 对象并调用它的方法 Tune();

【问题讨论】:

  • 我会将AdvanceTuning 的实例作为参数传递给Adapter 构造函数,而不是传递一个字符串并“解析”它。
  • 适配器通常用于将一个接口转换为另一个接口 (en.wikipedia.org/wiki/Adapter_pattern),您实现的看起来更像策略或装饰器模式。
  • @Thomas 好的,谢谢,我会尝试将其作为参数传递。
  • 我也必须实施策略和装饰器。您能否验证一下这是哪种模式,以便我可以将此示例用作该模式
  • @Thomas 能否请您分享如何将高级调整实例传递给适配器构造函数的示例。

标签: java design-patterns adapter


【解决方案1】:

我有几点建议:

移动此代码:

if(Type.equalsIgnoreCase("Sharp")){

        aTune= new SharpTuning();
    }
    else if(Type.equalsIgnoreCase("LowKey")){
        aTune= new LowKeyTuning();
    }

进入某种工厂方法。

static AdvanceTuning create(String string){
 if(Type.equalsIgnoreCase("Sharp")){

            return new SharpTuning();
        }
        else if(Type.equalsIgnoreCase("LowKey")){
return new LowKeyTuning();
        }
}

你的适配器,让它接受不是字符串,而是AdvancedTune。如果需要,您将能够重用现有的曲调。 那么你的构造函数会是这样的

public Adapter(AdvanceTuning aTune){
this.aTune=aTune;
}

那么你可以通过adapter = new Adapter(create(type))创建你的适配器

您还可以考虑删除字符串常量,例如 SharpLowKey,并将它们替换为枚举。

但总的来说,查看您的代码,它给我带来了一个问题,在您的情况下使用适配器的目的是什么?我看不到你能从中得到什么

【讨论】:

  • 只是我必须使用相同的示例实现 6 种设计模式,这就是我使用适配器的原因,即使没有必要。你脑子里有没有可以在工厂、适配器、外观、策略、装饰器、轻量模式上实现的例子?
  • @MunaemRudab 也许在这种情况下你应该以不同的方式处理这个问题。创建不实现Play 接口的类Guitar,并创建适配器以添加吉他以使其像Play 一样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多