I like the use of to paths.
Advantage: The target coordinate/node has only to be given once.
Code
\documentclass[tikz]{standalone}
\tikzset{
*|/.style={
to path={
(perpendicular cs: horizontal line through={(\tikztostart)},
vertical line through={(\tikztotarget)})
% is the same as (\tikztostart -| \tikztotarget)
% but just to be safe: http://tex.stackexchange.com/a/29781/16595
-- (\tikztotarget) \tikztonodes
}
}
}
\begin{document}
\begin{tikzpicture}[node distance=3em]
\node(G) [rectangle,fill=red!5,draw=red,text width=5cm] {};
\node(H) [below of=G] {H};
\node(H1) [left of=H] {H1};
\node(H2) [right of=H] {H2};
\draw[->,*|] (G.south) to (H1.north);
\draw[->] (G.south) -- (H.north);
\draw[->] (G.south) to[*|] (H2.north);
\end{tikzpicture}
\end{document}
Output

For various different possibilities of this (and without the need to declare the anchors), you can define more styles like this. This is also part of my paths.ortho library (see my user info).
Note that this (as well as the original answer, see above) does currently not take the current transformation in account and just uses the anchors .north, .south, .east and .west.
Code
\documentclass[tikz]{standalone}
\makeatletter
\newif\iftikz@ortho@preflush
\tikz@ortho@preflushtrue
\let\tikz@origtotarget\pgfutil@empty
\tikzset{
|-/.style={to path={|- (\tikztotarget) \tikztonodes}},
-|/.style={to path={-| (\tikztotarget) \tikztonodes}},
*|/.style={to path={%
\pgfextra
\iftikz@shapeborder
\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
\ifdim\pgf@y>\tikz@lasty\relax
\edef\tikztostart{\tikztostart.north}%
\else
\edef\tikztostart{\tikztostart.south}%
\fi
\fi
\endpgfextra
(perpendicular cs: horizontal line through={(\tikztostart)},
vertical line through={(\tikztotarget)}) -- (\tikztotarget) \tikztonodes
}},
*-/.style={to path={%
\pgfextra
\iftikz@shapeborder
\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
\ifdim\pgf@x>\tikz@lastx\relax
\edef\tikztostart{\tikztostart.east}%
\else
\edef\tikztostart{\tikztostart.west}%
\fi
\fi
\endpgfextra
(perpendicular cs: vertical line through={(\tikztostart)},
horizontal line through={(\tikztotarget)}) -- (\tikztotarget) \tikztonodes
}},
|*/.style={to path={%
\pgfextra
\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
\iftikz@shapeborder
\let\tikz@origtotarget\tikztotarget
\ifdim\pgf@y>\tikz@lasty\relax
\edef\tikztotarget{\tikztotarget.south}%
\else
\edef\tikztotarget{\tikztotarget.north}%
\fi
\fi
\endpgfextra
(\tikztostart) -- (perpendicular cs: vertical line through={(\tikztostart)},
horizontal line through={(\tikztotarget)})
\tikztonodes \ifx\tikz@origtotarget\pgfutil@empty\else\iftikz@ortho@preflush(\tikz@origtotarget)\fi\fi
}},
-*/.style={to path={%
\pgfextra
\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
\iftikz@shapeborder
\let\tikz@origtotarget\tikztotarget
\ifdim\pgf@x>\tikz@lastx\relax
\edef\tikztotarget{\tikztotarget.west}%
\else
\edef\tikztotarget{\tikztotarget.east}%
\fi
\fi
\endpgfextra
(\tikztostart) -- (perpendicular cs: horizontal line through={(\tikztostart)},
vertical line through={(\tikztotarget)})
\tikztonodes \ifx\tikz@origtotarget\pgfutil@empty\else\iftikz@ortho@preflush(\tikz@origtotarget)\fi\fi
}},
node as new start/.is if=tikz@ortho@preflush
}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{scope}[nodes={shape=rectangle, draw, minimum width=+1.5cm, minimum height=+1cm}]
\node (a) {A};
\node (b) at ( .5, 2 ) {B};
\node (c) at ( 2.5,- .2) {C};
\node (d) at (- .5,-2 ) {D};
\node (e) at (-2.5, .2) {E};
\end{scope}
\tikzset{nodes={auto,font=\small\ttfamily}}
\path[->] (a) edge[*|] (b)
(b) edge[*|] node {*|} (a)
(a) edge[*-] (c)
(c) edge[*-] node[swap] {*-} (a)
(a) edge[|*] (d)
(d) edge[|*] node[swap] {|*} (a)
(a) edge[-*] (e)
(e) edge[-*] node {-*} (a)
%
{[every edge/.append style=blue]
{[|-]
(e) edge (b)
edge (d)}
{[-|]
(b) edge (c)
(d) edge (c)}}
;
\end{tikzpicture}
\begin{tikzpicture}[nodes={shape=rectangle, draw, minimum width=+1cm, minimum height=+1cm}]
\node (a) {A};
\node (b) at ( .25, 2) {B};
\node (c) at (1.25,-0) {C};
\draw (a) to [|*] (b) to (c);
\begin{scope}[xshift=3cm, node as new start=false]
\node (a) {A};
\node (b) at ( .25, 2) {B};
\node (c) at (1.25,-0) {C};
\draw (a) to [|*] (b) to (c);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[nodes={rectangle,draw,anchor=west,minimum height=+1cm}]
\node (rechteck1)[minimum width=+3cm] at (1,5){};
\node (rechteck2)[minimum width=+2cm] at (1,3){};
\draw [->] (rechteck1) to[*|] (rechteck2);
\end{tikzpicture}
\end{document}
Output

paths.ortholibrary (using files 1 and 2). – Qrrbrbirlbel Apr 10 '15 at 21:27-|in this answer corresponds to*|inpaths.orthowith the added bonus that you don't need to specify anchors. I don't know what the role of a point C should be. A vertical or horizontal line between two nodes with those keys inpaths.orthois fully defined. Maybe you can ask a separate question? – Qrrbrbirlbel Apr 10 '15 at 23:52