我有哪种图案
本文关键字: | 更新日期: 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");
}
}