使用类的实例作为参考

时间:2016-05-20 12:11:46

标签: java oop design-patterns

我需要一些关于课堂设计的帮助,或者更好地提到一个针对问题的常见设计模式的参考。

我在航空业工作。到目前为止,我的编程技巧是VBA和基本的JAVA应用程序。 作为一名工程师,我的任务是创建CAD模型,用于固定飞机厨房内外的组件。为了确保高可重用性并缩短开发时间,我想创建一个可以推荐以前解决方案的程序。 基本上每个航空器运营商都可以从目录中选择它想要安装的厨房/厨房(纪念碑)。这些纪念碑内有多个隔间。在隔间内,我们可以安装多个设备/组件。 我想写一个程序,可以告诉我"你之前已经安装了这些组件 - >在这个隔间 - >在该飞机上为该客户"

我已经对隔间,纪念碑和飞机进行了建模。每个类都扩展为同一个类BaseHolder:

public abstract class BaseHolder <I>  {

    private final ArrayList <I> heldItems = new ArrayList<I>();

    public boolean addItem(final I i){
        Objects.requireNonNull(i, "cannot add NULL");
        return heldItems.add(i);
    }

    public boolean removeItem(I i){
        return heldItems.remove(i);
    }

    public boolean contains(I i){
        return heldItems.contains(i);
    }

    public int itemCount(){
        return heldItems.size();
    }

    public boolean isEmpty(){
        return heldItems.isEmpty();
    }

    public void Clear() {
        heldItems.clear();
    }

    protected List<I> getHeldItems(){
        return heldItems;
    }

    public I getElement(int n){
        return heldItems.get(n);
    }
}

public class Aircraft extends BaseHolder<Monument> {
    // code
}

public class Monument extends BaseHolder<Compartment> {

    private String name;

    public Monument (String name){
        this.setName(name);
    }

    // code

    @Override
    public boolean addItem(final Compartment c) {
        Objects.requireNonNull(c, "cannot add NULL");

        if (contains (c) ){
            throw new IllegalArgumentException("Compartment already added!");
        };

        for(Compartment ctmp : getHeldItems()){
            if (ctmp.getName().equals(c.getName() ) ) {
                throw new IllegalArgumentException("Compartment with an identical name already exits");
            }
        }
        return getHeldItems().add(c);
    }

    public Compartment getCompartment(int n){
        return getHeldItems().get(n);
    }

    public Compartment getCompartment(String name){
        for(Compartment ctmp : getHeldItems()){
            if (ctmp.getName().equals(name) ) {
                return ctmp;
            }
        }
        return null;
    }
}

public class Compartment extends BaseHolder<IWeighable>{

    private String name = "";
    private double MAX_LOAD = 0.0;

    public Compartment (String name ,final  double max_load){
        this.setName(name);
        updateMaxLoad(max_load);
    }

    // code

    protected double getTotalLoad(){
        // code
    }

    /**
     * 
     * @param load
     * @throws InvalidParameterException if max load not >= than 0.0
     */
    public void setMaxLoad(final double load){
        if (load >= 0.0){
            this.MAX_LOAD = load;
        } else {
            throw new InvalidParameterException("max load must be greater than 0.0");
        }
    }

    public boolean isOverloaded(){
        return (getTotalLoad() > MAX_LOAD ) ;
    }
}

我遇到的问题是这种设计似乎有很多缺陷。除了相当繁琐之外:getElement(n).getElement(n).getElement(n) 将元素添加到隔间会导致所有飞机使用相同的隔间,并安装所有相同的设备/组件。因为它是DB中的同一个对象。需要一个隔间的实例。在将DB Compartment添加到飞机之前克隆它是不可取的。我需要能够改变允许负载,为所有人改变它。为了解决这个问题,我想到了使用某种类型的“包装”类,如:

public class MonumentManager {

    public ArrayList <Monument> monuments = new ArrayList<>();
    public ArrayList <LinkObect> links;

    class LinkObect{
        private Compartment c;

        private IWeighable e;

        LinkObect(Compartment c, IWeighable e){
            this.c = c;
            this.e = e;
        }
    }

    public boolean addMonument(Monument m){
        return monuments.add(m);
    }

    public void addElementToCompartment(IWeighable e, Compartment c){
        boolean known = false; //to check if the passed compartment is known/handeld to/by the MonumentManager
        for (Monument m : monuments){
            if ( m.getCompartment(c.getName() ) != null ) known = true;
        }

        if (known){
            links.add(new LinkObect(c, e));
        } else {
            throw new IllegalArgumentException("Compartment is not inside a managed Monument!");
        }
    }

    public List<Compartment> whereUsed(IWeighable e){
        // TODO 
    }
}

这门课可能会解决问题,但感觉很奇怪。任何人都可以指出我朝着共同的设计模式的正确方向等我正在从当地图书馆读一本关于设计模式的书。但它似乎略高于我。 (也许是我的任务)。

任何建议/帮助等都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我希望我能正确理解这一点。

有一件事是您要安装的Component具有某些特征,另一件事是您已经安装的内容的一些表示。

您的安装信息不需要在Component中,而在其他内容中,我们称之为Installation

您的Installation必须知道两件事:

  • 它是什么样的Component
  • 里面还有其他Installations

安装看起来像这样。

public class Installation {
  private Component type;
  private List<Installation> content;

  public Installation(Component type){
    this.type = type;
    this.content = new ArrayList<Component>();
  }

  //you can have methods for add, remove, etc...
}

随时请进一步澄清。