所以我有两个类: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();
}
}
该方法结束时,该服务将注册为关闭。