当前位置: 首页 > 知识库问答 >
问题:

使用工厂设计模式进行重新分解

陈阳舒
2023-03-14

我在重新分解旧代码时遇到了一些麻烦,这是学校的作业,所以...我打算使用工厂设计模式或策略,但我不确定如何在这个特定的场景中使用它们:

public void sunk(int i, int j)
{
    if(map[i][j]==hit)
    {

    //if the hit is not on an edge
    if(i<9 && i>0 && j<9 && j>0)
    {

        //dec above if odd
        if(map[i-1][j]!= hit && map[i-1][j]%2==1)
        {
            //if(map[i-1][j]==13)
            map[i-1][j]= map[i-1][j] -9;
        }

        //dec above if even
        if(map[i-1][j]!= hit && map[i-1][j]%2==0)
        {
            map[i-1][j]= map[i-1][j] -2;
        }

        //dec below if odd
        if(map[i+1][j]!= hit && map[i+1][j]%2==1)
        {
            map[i+1][j]= map[i+1][j] -9;
        }

        //dec below if even
        if(map[i+1][j]!= hit && map[i+1][j]%2==0)
        {
            map[i+1][j]= map[i+1][j] -2;
        }

        //dec left if even
        if(map[i][j-1]!= hit && map[i][j-1]%2==0)
        {
            map[i][j-1]= map[i][j-1] -4;
        }

        //dec left if odd
        if(map[i][j-1]!= hit && map[i][j-1]%2==1)
        {
            map[i][j-1]= map[i][j-1] -9;
        }

        //dec right if even
        if(map[i][j+1]!= hit && map[i][j+1]%2==0)
        {
            map[i][j+1]= map[i][j+1] -4;
        }

        //dec right if odd
        if(map[i][j+1]!= hit && map[i][j+1]%2==1)
        {
            map[i][j+1]= map[i][j+1] -9;
        }
    }

我一直在继续,因为我有很多if-else语句,所以我正在考虑使用上面的模式。帮助

共有2个答案

谯德元
2023-03-14

你可以在那里有一个策略。首先,从策略的界面开始。我不知道你在使用哪种语言,所以我将使用类似java的语言。

interface HitStrategy {
    bool AppliesTo(map, i, j);
    void Apply(map,i,j);
}

每个类都将实现不同的if块:

class DecRightIfOdd implements HitStrategy { 
    public bool AppliesTo(map, i, j){
        return map[i][j+1]!= hit && map[i][j+1]%2==1;
    }

    public void Apply(map,i,j){
         map[i][j+1]= map[i][j+1] -9;
    }
}

然后在您的代码中,您可以有一个HitStrategy列表,并找到适用于地图和位置的列表,然后调用Apply方法。

那么,为什么这比拥有一堆如果更好呢?您可以使用继承。在您的示例中,您有两个 Dec Right,一个用于奇数,一个用于偶数。您可以这样做:

abstract class DecRight implements HitStrategy { 
    public bool AppliesTo(map, i, j){
        return map[i][j+1]!= hit;
    }
    public abstract Apply(map,i,j);
}

class DecRightIfOdd inherits DecRight { 
    public bool AppliesTo(map, i, j){
        return base(map,i,j) && map[i][j+1]%2==0;
    }

    public void Apply(map,i,j){
         map[i][j+1]= map[i][j+1] -4;
    }
}

class DecRightIfEven inherits DecRight { 
    public bool AppliesTo(map, i, j){
        return base(map,i,j) && map[i][j+1]%2==1;
    }

    public void Apply(map,i,j){
         map[i][j+1]= map[i][j+1] -9;
    }
}

希望有帮助。

司空兴为
2023-03-14

我不确定这两种模式是否对你有帮助。

工厂将用于根据输入参数实例化对象的不同子类(或子类集)。

策略将用于在运行时替换类中的行为。

如果不进一步了解上面的代码试图实现什么,很难提出建议。对于上面这样的代码,可以封装到查找表中,这将为您提供一个简洁的实现(巨大?)可读性成本。

 类似资料:
  • 介绍 与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。 这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类类定义需要创建的对象类型

  • 本文向大家介绍Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】,包括了Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下: 一、 简单工厂 先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建

  • 我正在努力学习创造性设计模式,我想我现在理解了工厂方法模式。但在转向抽象工厂模式时,我找不到它的用途。我知道我错过了一些东西,但不知道在哪里。 在抽象工厂模式中,我们将有一个抽象工厂,混凝土工厂将返回实例。假设我们正在处理汽车的创建。我们将有一个像这样的抽象工厂 我们的混凝土工厂将是 在用户类中,我们将像 我认为我们也可以使用工厂模式构建相同的功能 在用户类中,我们可以 如果我的理解是正确的(如果

  • 本文向大家介绍PHP设计模式之简单工厂和工厂模式实例分析,包括了PHP设计模式之简单工厂和工厂模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之简单工厂和工厂模式。分享给大家供大家参考,具体如下: 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮

  • 简单工厂(Simple Factory) Intent 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 Class Diagram 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所

  • 4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 cr