我有哪种图案

本文关键字: | 更新日期: 2023-09-27 18:10:48

我有两个类,每个类都做相同的事情,但唯一的区别是,它们在代码中的某些函数中使用了不同的逻辑。比方说:

class A
{
    //has same fields, and method
    void GetDataTable()
    {
         //logic here changes up to table of the database and for some fields.
    }
}
class B
{
    //has same fields, and method
    void GetDataTable()
    {
         //logic here changes up to table of the database and for some fields.
    }
}

最后,我将添加另一个具有不同逻辑的相同行为类和GetDataTable方法。我必须应用什么样的设计模式或OO技术才能获得更高质量的代码。

我有哪种图案

您可能正在寻找战略模式

您用每个"逻辑"类必须实现的方法定义了一个接口。每个"逻辑"类都将实现这个接口,并在实现的方法中执行其逻辑。

interface IGetDataTable
{
    void GetDataTable();
}
class A : IGetDataTable
{
    public void GetDataTable() { /* Do logic here for class A */ }
}
class B : IGetDataTable
{
    public void GetDataTable() { /* Do logic here for class B */ }
}

然后根据需要选择适当的类(实现IGetDataTable(。

本身没有模式,只有继承。

我使用了一个抽象类而不是接口,因为您提到了一些常见的方法。

public abstract class MyBaseClass
{
    // TODO: Common methods here.
    // Inheriting classes must implement this.
    public abstract void GetDataTable();
}
public class A : MyBaseClass
{
    public void GetDataTable()
    {
        // Specific implementation here.
    }
}
public class B : MyBaseClass
{
    public void GetDataTable()
    {
        // Specific implementation here.
    }
}

如果您有使用这些类的东西,但只有GetDataTable方法,那么最好有一个接口。例如CCD_ 4。

如果没有,就没有必要,抽象类就是接口

public interface IGetDataTable
{
    void GetDataTable();
}
public abstract class MyBaseClass : IGetDataTable
{
    // TODO: Common methods here.
    // Inheriting classes must implement this.
    public abstract void GetDataTable();
}
public class A : MyBaseClass
{
    public void GetDataTable()
    {
        // Specific implementation here.
    }
}
public class B : MyBaseClass
{
    public void GetDataTable()
    {
        // Specific implementation here.
    }
}

您可以使用策略模式,也可以简单地为这两个类创建共同的抽象祖先。

正如Styxxy建议的那样,我使用这样的策略模式:

重构代码,结果是:

-更灵活
-可以在运行时更改行为
-无代码复制

class Program
{
    static void Main(string[] args)
    {
        Apply a = new Apply(); //I will create if I dont need any logic but be able to get AB's behavior, I will call that class NoApply
        Helper(a);
    }
    static void Helper(AB myobj)
    {
        myobj.CanGetDataTable();
    }
}
abstract class AB
{
    IGetDataTable gtb;
    public virtual void LogicSetter(IGetDataTable dt)
    {
        gtb = dt;
    }
    public void CanGetDataTable()
    {
        this.gtb.GetDataTable();
    }
    public void DoSameThingBothAB()
    {
        Console.WriteLine("do same things");
    }
}
class Apply:AB
{
    public Apply()
    {
        base.LogicSetter(new LogicForA());
    }
}
public interface IGetDataTable
{
    void GetDataTable();
}
public class LogicForA:IGetDataTable
{
    public void GetDataTable()
    {
        Console.WriteLine("logic for A");
    }
}
public class LogicForB:IGetDataTable
{
    public void GetDataTable()
    {
        Console.WriteLine("logic for B");
    }
}
public class LogicforFutured:IGetDataTable
{
    public void GetDataTable()
    {
        Console.WriteLine("logic for object created in 2019");
    }
}
相关文章:
  • 没有找到相关文章