23种设计模式——工厂模式+适配器模式实战

一、简介

业务需求,需要对不同的浏览器返回不同的url地址。

例如: Chrom浏览器返回:‘http://www.chrom.com’, IE浏览器返回:‘http://www.ie.com’

二、代码实现

1、根据这个业务需求,自然想到用工厂模式和适配器模式相结合方式解决

(1)工厂类

package com.xinrui.code.url.handler;

public class UrlTranslateFactory {
	/**
	 * 适配器工厂,根据浏览器类型返回不同的适配器实现类
	 * 
	 * @param version
	 * @return
	 */
	public UrlAdapter getUrlAdapter(String version) {
		switch (version) {
		case "IE":
			return new IEUrlAdapterImpl();
		case "Chrom":
			return new ChromUrlAdapterImpl();
		default:
			return new IEUrlAdapterImpl();
		}

	}
}

(2)需要适配的实体类

package com.xinrui.code.url.handler;

public class UrlBean {

	private String IEUrl;

	private String chromUrl;

	private String url;

	public String getIEUrl() {
		return IEUrl;
	}

	public void setIEUrl(String iEUrl) {
		IEUrl = iEUrl;
	}

	public String getChromUrl() {
		return chromUrl;
	}

	public void setChromUrl(String chromUrl) {
		this.chromUrl = chromUrl;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

}

(3)适配器类

package com.xinrui.code.url.handler;

public interface UrlAdapter {
	/**
	 * 适配器,对urlBean进行适配
	 * 
	 * @param urlBean
	 */
	public void translate(UrlBean urlBean);

}

(4)适配器实现类

package com.xinrui.code.url.handler;

public class ChromUrlAdapterImpl implements UrlAdapter {
	/**
	 * 适配器实现类,对Chrom浏览器进行适配
	 */
	@Override
	public void translate(UrlBean urlBean) {
		urlBean.setUrl(urlBean.getChromUrl());
	}

}

package com.xinrui.code.url.handler;

public class IEUrlAdapterImpl implements UrlAdapter {
	/**
	 * 适配器实现类,对IE浏览器进行适配
	 */
	@Override
	public void translate(UrlBean urlBean) {
		urlBean.setUrl(urlBean.getIEUrl());
	}

}

(5)控制层使用适配器

package com.xinrui.code.url.handler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.xinrui.code.bean.BaseResultModel;

@Controller
@RequestMapping(value = "/url")
public class UrlController {

	@Autowired
	private UrlTranslateFactory urlTranslateFactory;

	@RequestMapping(value = "/get")
	@ResponseBody
	public BaseResultModel getUrl(@RequestHeader(value = "version", defaultValue = "version") String version) {
		// 数据库取得实体类,此处省略,直接使用
		UrlBean urlBean = new UrlBean();
		urlBean.setChromUrl("http://www.chrome.com");
		urlBean.setIEUrl("http://www.ie.com");
		BaseResultModel baseResultModel = new BaseResultModel();
		UrlAdapter urlAdapter = urlTranslateFactory.getUrlAdapter(version);
		urlAdapter.translate(urlBean);
		baseResultModel.setValue(urlBean);
		return baseResultModel;
	}

	/**
	 * 根据不同的浏览器返回不同的url地址
	 */
	public static void main(String[] args) {
		// 设置url实体类
		UrlBean urlBean = new UrlBean();
		urlBean.setChromUrl("http://www.chrome.com");
		urlBean.setIEUrl("http://www.ie.com");
		UrlTranslateFactory urlTranslateFactory = new UrlTranslateFactory();

		// 浏览器为IE浏览器
		String version = "IE";
		UrlAdapter urlAdapter = urlTranslateFactory.getUrlAdapter(version);
		urlAdapter.translate(urlBean);
		System.out.println("url=" + urlBean.getUrl());

		// 浏览器为Chrom浏览器
		String version1 = "Chrom";
		UrlAdapter urlAdapter1 = urlTranslateFactory.getUrlAdapter(version1);
		urlAdapter1.translate(urlBean);
		System.out.println("url=" + urlBean.getUrl());
	}

	/**
	 * 业务需求,需要对不同的浏览器返回不同的url地址,例如: Chrom浏览器返回:'http://www.chrom.com'
	 * IE浏览器返回:'http://www.ie.com'
	 */
}

(6)控制台输出

	url=http://www.ie.com
	url=http://www.chrome.com

三、总结

这里的工厂模式和适配器模式主要是面向接口进行设计,主要是取决于业务需求,千万不要为了使用设计模式而使用。

你可能感兴趣的:(设计模式,设计模式)