<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 < </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 >= </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><T> </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 < 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><T> </code><code>boolean</code> <code>isRepetitive(T[] array){</code>
<code> </code><code>Set<T> set = </code><code>new</code> <code>HashSet<T>();</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) && 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) && 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) && 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,如需转载请自行联系原作者