【问题标题】:Java 8: looking for a design pattern to reduce code duplicationJava 8:寻找减少代码重复的设计模式
【发布时间】:2020-06-20 18:26:31
【问题描述】:

我正在参加以下测试课程。我想知道是否有一种设计模式可以减少以下场景中的代码重复。

public abstract class BaseTestClass {

    protected String color;

    protected String type;

    protected Product product;

    abstract void setColor();

    abstract void setClothType();

    abstract Product createTheProduct();

    @BeforeClass
    public void setUp(){
      // there're partial overlaps of "setup" for pants and shirts
    }

    @Test
    public void doATest(){
        testSomethingWithProduct(product);
    }

    @AfterClass
    public void tearDown(){
      // there're partial overlaps of "tearDown" for pants and shirts
    }
}


public class TestBlueShirt extends BaseTestClass {

    @Override
    void setColor() {
        this.color = "blue";
    }

    @Override
    void setClothType() {
        this.type = "shirt";
    }

    @Override
    Product createTheProduct() {
       setColor();
       setClothType();
       // create this.product based on color and type...
    }
}

public class TestRedShirt extends BaseTestClass {}
public class TestBluePants extends BaseTestClass {}
public class TestRedPants extends BaseTestClass {}
...

在为同一种布料设置颜色或为同一种颜色设置类型时,您会发现代码重复。我想知道我怎样才能有一个具体的类可以产生类似Class<T>(RedShirt、BlueShirt、RedPants 等)的东西,并且基于Class<T>,我可以直接在基类中实现@Test。所以我可以尽量避免代码重复。

类似:

public abstract class BaseTestClass {

    protected Product product;

    abstract Product createTheProduct(Class<T> ...);

    @BeforeClass
    public void setUp(){
      setUpBasedOnProduct(Class<T> ...);

    }

    @Test
    public void doATest(){
        testSomethingWithProduct(product);
    }

    @AfterClass
    public void tearDown(){
        tearDownBasedOnProduct(Class<T> ...);
    }
}

import ...ClassGenerator

public class TestBlueShirt extends BaseTestClass {
    
    @Override
    createTheProduct(ClassGenerator.createClass("blue", "shirt"));
}

提前致谢!

【问题讨论】:

标签: java design-patterns


【解决方案1】:

您想要创建一个对象,因此您正在寻找的内容属于创建设计模式的范畴。我不确定是否有适合您的需求,但Factory 模式符合您的一些需求。

在典型的工厂模式用例中,您将向方法提供类型(作为String 或枚举),并接收匹配的对象。您的逻辑会稍微复杂一点,因为会有多个输入和一些分支逻辑来定位正确的类型。例如,您不能只使用String“衬衫”来获取您的对象,因为颜色是内置在类型中的(您有RedShirtBlueShirt 等...)。

作为最后一点,我会考虑问自己为什么RedShirtBlueShirt 必须是不同的类型。我不会使用设计模式来解决问题,而是重新考虑原始设计。例如,您可以使用包含colortype 成员的Apparel extends Product 类,这样无论Apparel 的类型如何,您都可以查询该信息。当然,请根据您的情况做出最佳判断。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 2021-02-12
  • 1970-01-01
  • 2021-07-07
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多