我有一个界面有几种方法:
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... }
答案 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)
我会做这样的事情:
使用以下方法创建界面IExecuteOrder
:executeOrder(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();
}