2016-09-14 83 views
0

我正在编写一个图形浏览程序,并且遇到了一点绊脚石。打开/关闭原则和单一责任 - 图

My图表由VertexNetworkLink对象,并且可以通过查询一个GeographyModel对象obatined。

想法是List<NetworkLink>GeographyModel检索,然后提供给MetaMap以获得所需的附加信息。

我想要做的是试图通过创建MetaMap对象坚持以打开/关闭原则通过增加信息的每个NetworkLink,但有所有我在扭曲短裤至于如何做到这一点!

以下是MetaMap的代码。现在

public class MetaMap<T> { 

private final String name; 
private final Map<NetworkLink, List<T>> metaData; 
private final Map<T, Set<NetworkLink>> reverseLookup; 
private final List<T> fallback; 
private final List<T> information; 

public MetaMap(String name, T fallback){ 
    this.name = name; 
    this.metaData = new HashMap<>(); 
    this.reverseLookup = new HashMap<>(); 
    this.fallback = new ArrayList<>(); 
    this.fallback.add(fallback); 
    this.information = new ArrayList<>(); 
} 

/** 
* Returns an identifier giving the information contained in this map 
* 
* @return 
*/ 
public String getName() { 
    return name; 
} 

/** 
* Marks from origin to destination with information of type T 
* 
* @param line 
* @param information 
*/ 
public void markLineFragment(RunningLine line, T information) { 
    line.getLinks().stream().map((link) -> { 
     if(!metaData.containsKey(link)) { 
      metaData.put(link, new ArrayList<>()); 
     } 
     return link;    
    }).forEach((link) -> { 
     metaData.get(link).add(information); 
    }); 

    if(!reverseLookup.containsKey(information)) { 
     reverseLookup.put(information, new HashSet<>()); 
    } 

    reverseLookup.get(information).addAll(line.getLinks()); 
} 

/** 
* Returns the information on the given NetworkLink 
* 
* @param link 
* @return 
*/ 
public List<T> getInformation(NetworkLink link) { 
    return metaData.getOrDefault(link, fallback); 
} 

/** 
* Returns the information associated with the given line fragment 
* @param line 
* @return 
*/ 

public List<T> getInformation(RunningLine line) { 
    Set<T> resultSet = new HashSet(); 

    line.getLinks().stream().forEach((link) -> { 
     List<T> result = getInformation(link); 

     resultSet.addAll(result); 
    }); 

    return new ArrayList<>(resultSet); 
} 

/** 
* Returns all of the matching links which match the given information 
* @param information 
* @return 
*/ 

public List<NetworkLink> getMatchingLinks(T information) { 
    return new ArrayList<>(reverseLookup.get(information)); 
} 

public void addInformation(T info) { 
    information.add(info); 
} 

public void removeInformation(T info) { 
    information.remove(info); 
} 

...我的问题是,当我扩展该计划,每一个新的部分将需要这是从GeographyModel派生的新MetaMap

我想跟随OCP和SRP,因为我正在添加该程序的功能,但在实现/结合这两个概念时遇到困难。有几个想法确实发生...

我可以让每个新模型需要MetaMap注册本身GeographyModel,但担心我会违反SRP。每个新的prgoram功能都可以拥有MetaMap并对其进行维护,但这首先需要查询GeographyModel

任何想法,我可以如何处理这个?

+1

工程设计致死... – Holger

回答

1

为什么要实施OCP?你想解决什么问题? 如果你只是因为其他人认为它很好才实施OCP,我强烈建议你三思。

SOLID/GRASP中的每个原则以及设计模式都是公会线和针对特定类型问题的解决方案。基本上他们是工具。你应该首先确定你的问题,并尽可能清楚地说明问题。他们你将能够选择正确的工具来处理它们。

盲目实施SOLID/GRASP或设计模式非常像用锤子烹饪食物。如果你足够幸运,你可能会成功,但我们都知道这个概率很低。

https://www.u-cursos.cl/usuario/777719ab2ddbbdb16d99df29431d3036/mi_blog/r/head_first_design_patterns.pdf

请浏览到六百八十一分之一百二十五页面(顶部栏上)并阅读整个页面!

+0

谢谢 - 这是有帮助的。我正在学习,第一段对我来说是头疼的问题。 – swshaun