- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习java设计模式,我想知道我是否可以应用一些来解决以下问题。我有士兵类和一些子类,例如:将军和中士。我正在创建 Solider 对象,并且在运行时我想将此对象更改为 General 或 Sergeant 对象,或者使用之前创建的 Solider 对象创建新的 Sergeant 或 General 对象:
Solider s = new Solider(...);
.....
if (generalCondition) {
General g = createGeneralFromSolider(s);
//or better:
//General g = promoteSoliderToGeneral(s);
} else if (sergeantCondition) {
Sergeant sr = createSergeantFromSolider(s);
//or better:
//Sergeant sr = promoteSoliderToSergeant(s);
}
首先,我决定在将军/中士类中创建额外的构造函数:
Class General extends Solider {
General(Solider s, Map<String, String> generalSpecificParams) {
//first we are going to copy all solider params to general params (bad idea if we have a lot of params)
this.setParamX(s.getParamX());
....
//then we can assign the rest of general-specific params
this.setGeneralSpecificParams(generalSpecificParams);
}
}
并在 createGeneralFromSolider 方法中使用它,但我不确定这是否是一种优雅的方式。主要缺点是我创建了新对象,因此在调用 createGeneralFromSolider 后,内存中有 2 个对象。我宁愿在内存中拥有一个对象:从士兵晋升的将军/中士(将军/中士对象,之前是士兵对象)。我想知道是否可以使用一些设计模式来解决它。我记得在 C++ 中存在类似复制构造函数的东西,它通过一个接一个地分配所有参数,将所有参数从一个对象复制到另一个对象。在 Java 中我没有听说过类似的事情。
最佳答案
您可能需要使用 Factory这种情况的模式。例如:
public class SoldierFactory {
//use getSoldier method to get object of type Soldier
public Soldier getSoldier(String soldierType){
if(soldierType == null){
return null;
}
if(soldierType.equals("case1")){
return new General();
} else if(soldierType.equals("case2")){
return new Sergeant();
} else if(.....
}
return null;
}
}
public class FactoryPatternDemo {
public static void main(String[] args) {
SoldierFactory soldierFactory = new SoldierFactory();
Soldier s1 = soldierFactory.getsoldier("case1");
}
}
我认为最好不要在调用 Soldier 工厂之前创建 Soldier。不管在运行时你都会改变它吗?
关于java - 在java中创建父对象的基础上创建子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189704/
我一直在从事一个开源项目。它使用安装在 jdk8 镜像上的构建生成的 debian (.deb) 软件包创建 docker 镜像。 但最近我开始犯错误,不幸的是我无法克服它。一旦通过 Dockerfi
我正在尝试使这些卡片可点击以重定向到另一个屏幕,但我无法弄清楚 let cards = this.state.items.map(item => ( Actions.dog
我是一名优秀的程序员,十分优秀!