以不同的顺序调用接口方法

时间:2016-10-13 15:14:02

标签: java design-patterns

我有一个界面有几种方法:

interface IExample {
 methodA();
 methodB();
 methodC();
 ...
 methodN();
}

我也有几个该接口的实现(例如A类,B类......)。我也有HashMap,我根据特定的键放置了这些实现:

commands = new HashMap<String, IExample>();
commands.put("key1", new A());
.
.
commands.put("keyN", new N());

我使用策略设计模式在某些事件发生时获取每个实现:

Event event = ...
IExample example = UtilClass.commands.get(event.getKey());

现在我可以调用特定实现的方法:

example.methodA();
...

问题在于,根据事件,方法调用顺序是不同的。因此,对于key1,调用顺序为:

example.methodC();
example.methodA();
...

但对于不同的密钥,假设为key2,方法调用顺序为:

example.methodA()
example.methodC()
...

我可以使用哪种设计模式或方法以简单明了的方式解决这个问题?不要使用这样的东西:

 if (example instance of A) {    call order for A... }

 if (example instance of B) {    call order for B... }

3 个答案:

答案 0 :(得分:2)

您只需在IExample界面中添加其他方法:

interface IExample {
    methodA();
    methodB();
    methodC();
    ...
    methodN();

    execute();
}

class A implements IExample {
    //...
    execute() {
        methodA();
        methodC();
    }
}

...

commands.get("key1").execute();

如果无法更改IExample界面,或者有许多订单重复,您可以将execute()方法移至另一个界面IExecutor

interface IExecutor {
    execute();
}

class Executor1 implements IExecutor {
    private final IExample example;
    public Executor1(IExample example) { this.example = example; }
    execute() {
        example.methodA();
        example.methodC();
    }
}

并管理IExecutor而非IExample的哈希地图:

commands = new HashMap<String, IExecutor>();
commands.put("key1", new Executor1(new ExampleA()));
commands.put("key2", new Executor1(new ExampleB()));
...
commands.get("key1").execute();

答案 1 :(得分:1)

我会做这样的事情: 使用以下方法创建界面IExecuteOrderexecuteOrder(IExample example);

然后根据您的执行顺序在不同的类中实现executeOrder方法。 实施例

class ExecuteOrder1 implements IExecuteOrder{
  public executeOrder(IExample example){
  example.methodA();
  example.methodC();
  example.methodB();
 }
}

然后将这些实现放在像。

这样的地图中
Map<String, IExecuteOrder> map = new HashMap<>();
map.put("key1", new ExecuteOrder1());
map.put("key2", new ExecuteOrder2());
...
map.put("keyn", new ExecuteOrderN());

最后,您将调用您的方法:

map.get("key1").executeOrder(example);

答案 2 :(得分:0)

我只想在# $url = "ftp://XXX.com/" $user = 'UserName' $pass = 'Password' $folder = 'FTP_Folder' $target = "C:\Folder\Folder1\" #SET CREDENTIALS $credentials = new-object System.Net.NetworkCredential($user, $pass) function Get-FtpDir ($url,$credentials) { $request = [Net.WebRequest]::Create($url) $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory if ($credentials) { $request.Credentials = $credentials } $response = $request.GetResponse() $reader = New-Object IO.StreamReader $response.GetResponseStream() $reader.ReadToEnd() $reader.Close() $response.Close() } #SET FOLDER PATH $folderPath= $ftp + "/" + $folder + "/" $Allfiles=Get-FTPDir -url $folderPath -credentials $credentials $files = ($Allfiles -split "`r`n") $files $webclient = New-Object System.Net.WebClient $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) $counter = 0 foreach ($file in ($files | where {$_ -like "*.txt"})){ $source=$folderPath + $file $destination = $target + $file $webclient.DownloadFile($source, $target+$file) #PRINT FILE NAME AND COUNTER $counter++ $counter $source } 接口中声明另一种方法:

IExample

每个类都需要实现这个interface IExample { methodA(); methodB(); methodC(); // ... methodN(); runInOrder(); } 方法,该方法只需按照所需的顺序调用runInOrder方法。

即。 class methodX(匹配A)将实现"key1",如下所示:

runInOrder

等。然后,您可以这样做:

@Override
public void runInOrder() {

    this.methodC();
    this.methodA();
}