是否存在经常更改的数据对象结构的设计模式?

时间:2016-09-30 13:31:06

标签: design-patterns

是否存在经常更改的数据对象结构的设计模式?

我正在重构遗传算法,其中染色体的结构(基因数量,基因类型和基因边界)从问题变为问题。例如:

可能会出现一个问题

- PRODUCTS (having: ID, NAME, PRICE)
- LIKES (having: ID, PRODID, NAME)

可能会使用另一个问题

$products = DB::table('PRODUCTS')
                  ->get();

$likes = DB::table('LIKES')
                  ->select(DB::raw('count(*) as total'))
                  ->where('PRODID', '=', 'product id from first table')
                  ->get();

目前,染色体结构是硬编码的,并且难以针对新问题进行修改。我正在考虑修改染色体变化的策略模式,除非有人有更好的想法。

2 个答案:

答案 0 :(得分:0)

如果染色体只是基因对象的集合,它们就变得更容易使用,特别是如果边界也被视为对象。

public class Gene
{
    public string Id { get; set; }
    public double Value { get; set; }
    public Boundary Boundary { get; set; }
}

public class Boundary
{
    public double? Minimum { get; set; }
    public double? Maximum { get; set; }
}

public class Chromosome
{
    public string Name { get; set; }
    public List<Gene> Genes { get; set; }
}

然后可以简单地通过向染色体提供必要基因列表来制作新的染色体实例......

 var chromosome1 = new Chromosome
     {
        Name = "Biggie",
        Genes = new List<Gene>
                {
                  new Gene {Id = "1", Boundary = new Boundary {Minimum = 0, Maximum = 100}},
                  new Gene {Id = "2", Boundary = new Boundary {Minimum = -7.3, Maximum = 9}}
                }
     };

 var chromosome2 = new Chromosome
      {
             Name = "Fusion",
             Genes = new List<Gene>
             {
                new Gene {Id = "1", Boundary = new Boundary {Minimum = 200, Maximum = 1000}},
                new Gene {Id = "2", Boundary = new Boundary {Minimum = 50}},
                new Gene {Id = "3", Boundary = new Boundary {Maximum = -5}}
              }
      };

由于所有染色体现在具有相同的结构,因此驱动染色体创建数据变得相对微不足道。染色体定义可以存储在配置文件或数据库中,并根据需要添加新的染色体定义。每个染色体对象都可以通过一个简单的循环填充,该循环读取它所包含的基因列表。

答案 1 :(得分:0)

感谢dbugger的帮助,我相信我有一个解决方案。为简单起见,我省略了ID和Boundary。 IGene和Gene类是解决方案。 TestGene是一个测试实现。

public interface IGene<T>{
    //Accessors
    public T            getValue();

    public void         setValue(T value);
}

public class Gene<T> implements IGene<T> {
    //Attributes
    T           _value;

    //Accessors
    public T            getValue(){ return this._value;}

    public void         setValue(T value){  this._value = value; }
}

import java.util.ArrayList;
import java.util.List;

public class TestGene {
    public enum EnumType {VALUE1, VALUE2}

    public TestGene() {
        IGene gene;

        List<IGene> chromosome = new ArrayList();

        gene= new Gene<Double>();
        gene.setValue(1.08);
        chromosome.add(gene);

        gene = new Gene<Integer>();
        gene.setValue(3);
        chromosome.add(gene); 

        gene = new Gene<EnumType>();
        gene.setValue(EnumType.VALUE1 );
        chromosome.add(gene);   

        for (int i = 0; i < chromosome.size(); i++ ){
            System.out.println( chromosome.get(i).getValue() );
        }
    }