今天早些时候我也问过类似的问题,但现在我被告知要求已经改变了。
我有3个班级-- Product,ProductOffering (PO)和ProductOfferingLists (POL)。产品包含PO,PO包含POL。所有这些类都扩展了一个名为CMS的抽象类。
我想将PO附加到P,POL附加到PO,但我正在寻找一种可重用的方法,因为逻辑是相同的,除了类名。
不幸的是,我的tester类需要两个方法,而hierarchy类需要一个强制转换来实现抽象的CMS契约。
这快把我逼疯了。如何才能使其更具可重用性,这样我才不会有多个方法和类型转换?
package puzzler;
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String[] args) {
Product p = new Product();
PO pa = new PO();
POL po = new POL();
List<PO> lpa = new ArrayList<PO>();
List<POL> lpo = new ArrayList<POL>();
attachChildToParent(lpa, p);
attachChildToParent(lpo, pa);
}
static void attachChildToParent(List<PO> listChild, Product parent) {
for (PO po : listChild) {
parent.attach(po);
}
}
static void attachChildToParent(List<POL> listChild, PO parent) {
for (POL po : listChild) {
parent.attach(po);
}
}
}CMS类:
package puzzler;
abstract class CMS {
abstract void attach(CMS childNode);
}产品分类-拥有PO的层次结构的顶层:
package puzzler;
import java.util.List;
public class Product extends CMS {
List<PO> lpo;
public List<PO> getLpo() {
return lpo;
}
public void setLpo(List<PO> lpo) {
this.lpo = lpo;
}
@Override
void attach(CMS childNode) {
this.getLpo().add((PO)childNode);
}
}Product Offering,由Product拥有,进而拥有Product Offering List
package puzzler;
import java.util.List;
public class PO extends CMS {
List<POL> lpol;
public List<POL> getLpo() {
return lpol;
}
public void setLpo(List<POL> lpol) {
this.lpol = lpol;
}
@Override
void attach(CMS childNode) {
this.getLpo().add((POL)childNode);
}
} PO拥有的产品列表(POL)
package puzzler;
public class POL extends CMS {
@Override
void attach(CMS childNode) {
throw new UnsupportedOperationException("Not supported yet.");
}
}发布于 2012-08-17 22:51:25
(使用Java 7语法,但很容易适应Java 6)
按如下方式定义CMS类:
public abstract class CMS<C extends CMS<?>> {
public abstract void attach(C childNode);
}然后,您的Product类可以如下所示:
public class Product extends CMS<PO> {
private List<PO> lpo = new ArrayList<>();
public List<PO> getLpo() {
return lpo;
}
public void setLpo(List<PO> lpo) {
this.lpo = lpo;
}
@Override
public void attach(PO childNode) {
getLpo().add(childNode);
}
}然后,您的PO类可以如下所示:
public class PO extends CMS<POL> {
private List<POL> lpol = new ArrayList<>();
public List<POL> getLpo() {
return lpol;
}
public void setLpo(List<POL> lpol) {
this.lpol = lpol;
}
@Override
public void attach(POL childNode) {
getLpo().add(childNode);
}
}然后,您的POL类可以如下所示:
public class POL extends CMS<CMS<?>> {
@Override
public void attach(CMS<?> child) {
throw new UnsupportedOperationException("Not supported yet.");
}
}最后,您的Tester类可能如下所示:
public class Tester {
public static void main(String[] args) {
Product p = new Product();
PO po = new PO();
List<PO> pos = new ArrayList<PO>();
List<POL> pols = new ArrayList<POL>();
attachChildToParent(pos, p);
attachChildToParent(pols, po);
}
private static <C extends CMS<?>> void attachChildToParent(List<C> childNodes, CMS<C> parent) {
for (C childNode : childNodes) {
parent.attach(childNode);
}
}
}只需要一个方法,不需要强制转换。
发布于 2012-08-17 22:21:56
只需将泛型与组合模式一起使用,例如
中通过类型
http://en.wikipedia.org/wiki/Generics_in_Java
http://en.wikipedia.org/wiki/Composite_pattern
发布于 2012-08-17 23:27:49
抽象类就像在实现类中使用的接口一样,需要在任何地方使用。
删除了额外的强制转换,并用一个方法替换了两个方法。
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String[] args) {
Product p = new Product();
PO pa = new PO();
POL po = new POL();
List<CMS> lpa = new ArrayList<CMS>();
List<CMS> lpo = new ArrayList<CMS>();
attachChildToParent(lpa, p);
attachChildToParent(lpo, pa);
}
static void attachChildToParent(List<CMS> listChild, CMS parent) {
for (CMS po : listChild) {
parent.attach(po);
}
}
}
abstract class CMS {
abstract void attach(CMS childNode);
}
class Product extends CMS {
List<CMS> lpo;
public List<CMS> getLpo() {
return lpo;
}
public void setLpo(List<CMS> lpo) {
this.lpo = lpo;
}
@Override
void attach(CMS childNode) {
this.getLpo().add(childNode);
}
}
class PO extends CMS {
List<CMS> lpol;
public List<CMS> getLpo() {
return lpol;
}
public void setLpo(List<CMS> lpol) {
this.lpol = lpol;
}
@Override
void attach(CMS childNode) {
this.getLpo().add(childNode);
}
}
class POL extends CMS {
@Override
void attach(CMS childNode) {
throw new UnsupportedOperationException("Not supported yet.");
}
}https://stackoverflow.com/questions/12007533
复制相似问题