天天看點

責任鍊模式執行個體

<code>package</code> <code>com.try2better.practice.controller;</code>

<code>import</code> <code>org.springframework.beans.factory.annotation.Autowired;</code>

<code>import</code> <code>org.springframework.stereotype.Controller;</code>

<code>import</code> <code>org.springframework.web.bind.annotation.RequestMapping;</code>

<code>import</code> <code>org.springframework.web.bind.annotation.ResponseBody;</code>

<code>import</code> <code>com.try2better.practice.service.version.VersionsService;</code>

<code>@Controller</code>

<code>@RequestMapping</code><code>(</code><code>"/version"</code><code>)</code>

<code>public</code> <code>class</code> <code>VersionController {</code>

<code>    </code><code>@Autowired</code>

<code>    </code><code>private</code> <code>VersionsService versionsService;</code>

<code>    </code> 

<code>    </code><code>@ResponseBody</code>

<code>    </code><code>@RequestMapping</code><code>(value=</code><code>"/ping"</code><code>)</code>

<code>    </code><code>public</code> <code>String ping(String version){</code>

<code>        </code><code>return</code> <code>versionsService.execute(version);</code>

<code>    </code><code>}</code>

<code>}</code>

<code>package</code> <code>com.try2better.practice.service.version;</code>

<code>import</code> <code>java.util.HashSet;</code>

<code>import</code> <code>java.util.Set;</code>

<code>import</code> <code>org.springframework.stereotype.Service;</code>

<code>@Service</code>

<code>public</code> <code>class</code> <code>VersionsService {</code>

<code>    </code><code>private</code> <code>AbastractService headVersionService;</code>

<code>    </code><code>private</code> <code>Version1Service version1Service;</code>

<code>    </code><code>private</code> <code>Version2Service version2Service;</code>

<code>    </code><code>private</code> <code>Version3Service version3Service;</code>

<code>    </code><code>public</code> <code>String execute(String version){</code>

<code>        </code><code>//構造責任鍊</code>

<code>        </code><code>buildNextService();</code>

<code>        </code><code>return</code> <code>headVersionService.execute(version);</code>

<code>    </code><code>private</code> <code>void</code> <code>buildNextService(){</code>

<code>        </code><code>AbastractService[] abastractServiceArray = </code><code>new</code> <code>AbastractService[]{</code>

<code>                </code><code>version1Service,</code>

<code>                </code><code>version2Service,</code>

<code>                </code><code>version3Service</code>

<code>        </code><code>};</code>

<code>        </code><code>if</code><code>(abastractServiceArray == </code><code>null</code> <code>|| abastractServiceArray.length &lt; </code><code>1</code><code>){</code>

<code>            </code><code>throw</code> <code>new</code> <code>RuntimeException(</code><code>"沒有處理的service!"</code><code>);</code>

<code>        </code><code>}</code>

<code>        </code><code>if</code><code>(hasNull(abastractServiceArray)){</code>

<code>            </code><code>throw</code> <code>new</code> <code>RuntimeException(</code><code>"有service為null的情況!"</code><code>);</code>

<code>        </code><code>if</code><code>(isRepetitive(abastractServiceArray)){</code>

<code>            </code><code>throw</code> <code>new</code> <code>RuntimeException(</code><code>"有循環依賴的情況,有可能造成死循環!"</code><code>);</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = abastractServiceArray.length - </code><code>2</code><code>; i &gt;= </code><code>0</code><code>; i--) {</code>

<code>            </code><code>abastractServiceArray[i].setNextAbastractService(abastractServiceArray[i + </code><code>1</code><code>]);</code>

<code>        </code><code>headVersionService = abastractServiceArray[</code><code>0</code><code>];</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 判斷service有無為空的情況</code>

<code>     </code><code>* </code>

<code>     </code><code>* @param array</code>

<code>     </code><code>* @return  </code>

<code>     </code><code>* @author zhouh-b</code>

<code>     </code><code>* @time 2017年9月13日</code>

<code>     </code><code>*/</code>

<code>    </code><code>private</code> <code>&lt;T&gt; </code><code>boolean</code> <code>hasNull(T[] array){</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; array.length; i++) {</code>

<code>            </code><code>if</code><code>(array[i] == </code><code>null</code><code>){</code>

<code>                </code><code>return</code> <code>true</code><code>;</code>

<code>            </code><code>}</code>

<code>        </code><code>return</code> <code>false</code><code>;</code>

<code>     </code><code>* 判斷有無重複的情況,如果有可能造成死循環</code>

<code>    </code><code>private</code> <code>&lt;T&gt; </code><code>boolean</code> <code>isRepetitive(T[] array){</code>

<code>        </code><code>Set&lt;T&gt; set = </code><code>new</code> <code>HashSet&lt;T&gt;();</code>

<code>            </code><code>set.add(array[i]);</code>

<code>        </code><code>return</code> <code>(array.length != set.size());</code>

<code>public</code> <code>abstract</code> <code>class</code> <code>AbastractService {</code>

<code>    </code><code>private</code> <code>AbastractService nextAbastractService;</code>

<code>    </code><code>//公用的方法</code>

<code>    </code><code>public</code> <code>void</code> <code>commonMethods(){</code>

<code>        </code><code>//...</code>

<code>    </code><code>public</code> <code>abstract</code> <code>boolean</code> <code>canHandle(String version);</code>

<code>    </code><code>public</code> <code>abstract</code> <code>String doBusiness(String version);</code>

<code>    </code><code>public</code> <code>String execute(String version) {</code>

<code>        </code><code>if</code><code>(canHandle(version)){</code>

<code>            </code><code>return</code> <code>doBusiness(version);</code>

<code>        </code><code>}</code><code>else</code><code>{</code>

<code>            </code><code>AbastractService nextService = getNextAbastractService();</code>

<code>            </code><code>if</code><code>(nextService == </code><code>null</code><code>){</code>

<code>                </code><code>throw</code> <code>new</code> <code>RuntimeException(</code><code>"沒有比對的service能夠處理version:"</code> <code>+ version);</code>

<code>            </code><code>return</code> <code>nextService.execute(version);</code>

<code>    </code><code>public</code> <code>AbastractService getNextAbastractService() {</code>

<code>        </code><code>return</code> <code>nextAbastractService;</code>

<code>    </code><code>public</code> <code>void</code> <code>setNextAbastractService(AbastractService nextAbastractService) {</code>

<code>        </code><code>this</code><code>.nextAbastractService = nextAbastractService;</code>

<code>import</code> <code>org.apache.commons.lang.StringUtils;</code>

<code>public</code> <code>class</code> <code>Version1Service </code><code>extends</code> <code>AbastractService{</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>boolean</code> <code>canHandle(String version) {</code>

<code>        </code><code>return</code> <code>StringUtils.isNotBlank(version) &amp;&amp; version.equals(</code><code>"1"</code><code>);</code>

<code>    </code><code>public</code> <code>String doBusiness(String version) {</code>

<code>        </code><code>return</code> <code>"version 1 service handle"</code><code>;</code>

<code>public</code> <code>class</code> <code>Version2Service </code><code>extends</code> <code>AbastractService{</code>

<code>        </code><code>return</code> <code>StringUtils.isNotBlank(version) &amp;&amp; version.equals(</code><code>"2"</code><code>);</code>

<code>        </code><code>return</code> <code>"version 2 service handle"</code><code>;</code>

<code>public</code> <code>class</code> <code>Version3Service </code><code>extends</code> <code>AbastractService{</code>

<code>        </code><code>return</code> <code>StringUtils.isNotBlank(version) &amp;&amp; version.equals(</code><code>"3"</code><code>);</code>

<code>        </code><code>return</code> <code>"version 3 service handle"</code><code>;</code>

本文轉自 斯然在天邊 51CTO部落格,原文連結:http://blog.51cto.com/13172906/1964890,如需轉載請自行聯系原作者

繼續閱讀