在当前具有CLI的平台上工作,但稍后将具有GUI。
爪哇。
基本上,目前有一个Platform类可以协调可插入元素的交互。平台是一个单身人士。
有一个CLI类,其中包含可以使用Platform及其插件的命令。
有时命令采用需要进一步用户交互(输入和输出)的平台组件(插件)。我正在考虑创建一个配置了Platform的UI界面,然后组件调用此界面来显示和获取输入。事件驱动的解决方案。
这是一个有效的设计吗?
还有更好的东西吗?
我试图让MVC风格的方法在我脑海中起作用,但问题是它似乎意味着CLI命令(即控制器)中有很多关于平台组件的前瞻性知识。这使得它们紧密耦合,并且我希望尽可能保持命令。这使得扩展程序更容易处理它们,并且为即将到来的GUI开发减少它们。
答案 0 :(得分:1)
MVC模式对于构建UI非常有用(无论是CLI,GUI,网页,REST API还是完全不同的东西)。出于集成目的,您将要使用其他模式,例如Facade。
让我们说你正在建造一台冰淇淋机。你有一个平台界面:
package com.plaform.icecream;
public interface IceCreamMachine {
public void measureCream(int milliLiters);
public void measureCondensedMilk(int milliLiters);
public void measureVanillaExtract(int tableSpoons);
public void measureCacaoPowder(int tableSpoons);
public void mixIngredients();
public void freezeConcoction();
public Object handOverExperimentResults();
}
然后你有你的MVC模型类:
package com.cli.icecream.model;
public class Icecream {
private int amount;
private Flavour flavour;
// getters, setters, toString, etc.
}
作为枚举的口味:
package com.cli.icecream.model.values;
public enum Flavour {
VANILLA, CHOCOLATE;
}
控制器:
package com.cli.icecream.controller;
public class IceCreamController {
private IceCreamFacade serviceFacade;
public IceCreamController(IceCreamFacade serviceFacade) {
this.serviceFacade = serviceFacade;
}
public void handleShowingFlavours() {
// ...
}
public IceCream handleOrderingIcecream(int balls, Flavour flavour) {
// validations, etc.
return serviceFacade.getIceCream(balls, flavour);
}
}
现在,从MVC隐藏产品背后的实际细节的方法,您可以创建一个将两者集成的Facade:
package com.cli.icecream.integration;
public interface IceCreamFacade {
public IceCream getIceCream(int balls, Flavour flavour);
}
和
package com.cli.icecream.integration;
public class IceCreamFacadeImpl {
private IceCreamMachine iceCreamMachine;
public IceCreaFacadeImpl(IceCreamMachine iceCreamMachine) {
this.iceCreamMachine = iceCreamMachine;
}
public IceCream getIceCream(int balls, Flavour flavour) {
int creamMl = ConversionUtil.calculateAmountOfCream(balls);
int condensedMilkMl = ConversionUtil.calculateAmountOfCondensedMilk(balls);
int flavourSubstanceTbsp = ConversionUtil.calculateAmountOfFlavourSubstance(balls);
iceCreamMachine.measureCream(creamMl);
iceCreamMachine.measureCondensedMilk(condensedMilkMl);
switch (flavour) {
case VANILLA:
iceCreamMachine.measureVanillaExtract(flavourSubstanceTbsp);
break;
case CHOCOLATE:
iceCreamMachine.measureCacaoPowder(flavourSubstanceTbsp);
break;
}
mixIngredients();
freezeConcoction();
Object results = iceCreamMachine.handOverExperimentResults();
return ConversionUtil.convertResultsToIceCream(results);
}
}
这样,UI(MVC)由幸福地不知道集成平台如何工作的类组成,反之亦然,即解耦。另外一个好处是,如果任一组件改变其行为,那么将两者集成在一起的所有逻辑都集中在一个地方,而不是遍布任何一个应用程序。