所以我有两个类:SoccerPlayer和IceHockeyPlayer
它们都有一些方法自己的接口:ISoccerPlayer和IIceHockeyPlayer

足球运动员:

public class SoccerPlayer implements ISoccerPlayer {

    public String[] teammembers;

    @Override
    public void kickFootball(int meters) {
        // Kick the football
    }

    @Override
    public void runForward(double speed) {
        // Run forward
    }

    @Override
    public void addTeammembers(String[] memberNames) {
        // Add the members
    }
}


IceHockeyPlayer:

public class IceHockeyPlayer implements IIceHockeyPlayer {

    public ArrayList<String> teammembers;

    @Override
    public void hitPuck(int meters) {
        // Hit the puck
    }

    @Override
    public void skateForward(double speed) {
        // Skate forward
    }

    @Override
    public void addTeammembers(ArrayList<String> memberNames) {
        // Add the members
    }

}


接下来,我创建了一个同时包含SoccerPlayer和IceHockeyPlayer的类,该类同时实现了两个接口,这就是我的适配器。
此类中的方法仅调用SoccerPlayer或IceHockeyPlayer的正确方法:

public class Adapter implements ISoccerPlayer, IIceHockeyPlayer {

    public SoccerPlayer soccerplayer;
    public IceHockeyPlayer icehockeyplayer;

    public Adapter(SoccerPlayer soccerplayer, IceHockeyPlayer icehockeyplayer) {
        this.soccerplayer = soccerplayer;
        this.icehockeyplayer = icehockeyplayer;
    }

    // SoccerPlayer
    @Override
    public void kickFootball(int meters) {
        this.soccerplayer.kickFootball(meters);
    }

    @Override
    public void runForward(double speed) {
        this.soccerplayer.runForward(speed);
    }

    @Override
    public void addTeammembers(String[] memberNames) {
        this.soccerplayer.addTeammembers(memberNames);
    }

    // IceHockeyPlayer
    @Override
    public void hitPuck(int meters) {
        this.icehockeyplayer.hitPuck(meters);
    }

    @Override
    public void skateForward(double speed) {
        this.icehockeyplayer.skateForward(speed);
    }

    @Override
    public void addTeammembers(ArrayList<String> memberNames) {
        this.icehockeyplayer.addTeammembers(memberNames);
    }

}


这是适配器模式的正确实现吗?如果没有,我需要进行什么更改才能使其成为一体?

最佳答案

那更像是门面。

对于适配器,您会遇到类似

interface SportsPlayer {
    public void play(int meters);
    public void move(double speed);
}


和类似的适配器

class IceHockeyPlayerAdapter implements SportsPlayer {
    private IceHockeyPlayer player;
    public IceHockeyPlayerAdapter(IceHockeyPlayer p) { player = p; }

    public void play(int meters) {
        player.playPuck(meters);
    }
    public void move(double speed) {
        player.skateForward(speed);
    }
}


这将“适应”冰球运动员“成为” SportsPlayer;因此实际上是另一种方法集。

编辑:

这是真正的JDK的适配器用法。

您知道可以使用try-with-resources来自动关闭资源,并且可以在提交任务后关闭ExecutorService吗?好吧,try-with-resources需要一个AutoCloseable,而ExecutorService没有实现。救援工具:

public class AutocloseableExecutorService implements ExecutorService, AutoCloseable {
    private ExecutorService delegate;
    public AutocloseableExecutorService(ExecutorService d) {
        delegate = d;
    }
    // delegate ExecutorService methods to implement the interface
    public void execute(Runnable r) { delegate.execute(r);
    // ...

    // implement close() for AutoCloseable
    public void close() {
        delegate.shutdown();
    }
}


所以现在您可以像这样使用它:

public void submitTasks(Runnable... rs) {
    try (AutocloseableExecutorService executor = new AutocloseableExecutorService(
             Executors.newSingleThreadExecutor())) {
        for (Runnable r : rs) executor.submit();
    }
}


该方法结束时,该服务将注册为关闭。

10-07 23:02