山東新華電腦學(xué)院學(xué)網(wǎng)站開發(fā)如何制作一個(gè)自己的網(wǎng)頁網(wǎng)站
作為一名程序員,你一定遇到或親自寫過這樣的代碼。有人將它形象的形容為shi山,或者被戲稱為“面向保就業(yè)編程”。
以下面這個(gè)代碼為例,其中的問題也顯而易見,當(dāng)越來越多的條件判斷時(shí),代碼會(huì)變得非常臃腫,難以維護(hù)。
String mediaType = "blogger";if ("lxf".equals(mediaType)) {System.out.println("廖雪峰");} else if ("JavaPub".equals(mediaType)) {System.out.println("知名博主");} else if ("msb".equals(mediaType)) {System.out.println("馬士兵");}...
解決
怎么辦呢?
首先想到的一定是使用三目運(yùn)算符,但是問題也顯而易見,不能處理過多的情況。
int price = condition?80:100;
還有什么辦法呢,枚舉定義、合并查詢條件、java8 新特性 Optional 等等,但是這些方法都治標(biāo)不治本。當(dāng)判斷多了起來,還是會(huì)變得臃腫。
策略模式
接下來就講一下今天的推薦方案,策略模式。
你一定不要排斥這種設(shè)計(jì)模式,簡單來看其實(shí)很簡單。
策略模式是一種行為設(shè)計(jì)模式,它允許你定義一系列算法,并將每種算法分別放入獨(dú)立的類中,以使算法的對象能夠相互替換。這句話可能有點(diǎn)繞,我們來看一個(gè)具體的例子。
首先,我們把每個(gè)條件邏輯代碼塊,抽象成一個(gè)公共的接口,可以得到以下代碼:
// 獲取博主信息接口public interface IMediaService {void showMedia();}
我們根據(jù)每個(gè)邏輯條件,定義相對應(yīng)的策略實(shí)現(xiàn)類,可得以下代碼:
// LXF策略實(shí)現(xiàn)類public class LXFMediaServiceImpl implements IMediaService {@Overridepublic void showMedia() {System.out.println("廖雪峰");}}// JavaPub策略實(shí)現(xiàn)類public class JavaPubMediaServiceImpl implements IMediaService {@Overridepublic void showMedia() {System.out.println("知名博主");}}// MSB策略實(shí)現(xiàn)類public class MSBMediaServiceImpl implements IMediaService {@Overridepublic void showMedia() {System.out.println("馬士兵");}}
接下來,我們再定義策略工廠類,用來管理這些博主信息實(shí)現(xiàn)策略類,如下:
// 博主信息服務(wù)工產(chǎn)類public class MediaServicesFactory {private static final Map<String, IMediaService> map = new HashMap<>();static {map.put("lxf", new LXFMediaServiceImpl());map.put("JavaPub", new JavaPubMediaServiceImpl());map.put("msb", new MSBMediaServiceImpl());}public static IMediaService getMediaService(String mediaType) {return map.get(mediaType);}}
使用了策略+工廠模式之后,代碼變得簡潔多了,如下:
public class Test {public static void main(String[] args) {String mediaType = "JavaPub";IMediaService mediaService = MediaServicesFactory.getMediaService(mediaType);mediaService.showMedia();}}
看到這里,是不是很簡單。
這樣的好處也顯而易見,就是可以靈活的切換不同的博主信息,比如:
- 我想看JavaPub的信息,只需要將mediaType設(shè)置為JavaPub即可。
- 我想看馬士兵的信息,只需要將mediaType設(shè)置為msb即可。