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浏览器进行适配*/@Overridepublic void translate(UrlBean urlBean) {urlBean.setUrl(urlBean.getChromUrl());}}
package com.xinrui.code.url.handler;public class IEUrlAdapterImpl implements UrlAdapter {/*** 适配器实现类,对IE浏览器进行适配*/@Overridepublic 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 {@Autowiredprivate UrlTranslateFactory urlTranslateFactory;@RequestMapping(value = "/get")@ResponseBodypublic 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.comurl=http://www.chrome.com
三、总结
这里的工厂模式和适配器模式主要是面向接口进行设计,主要是取决于业务需求,千万不要为了使用设计模式而使用。
23种设计模式——工厂模式+适配器模式实战相关推荐
- 23种设计模式-工厂模式
23种设计模式-工厂模式 前言: [我们为什么需要使用工厂模式?] /*** 在使用工厂模式之前,我们要创建 实现了相同接口的对象 都需要直接new(),如下* */@Testpublic void ...
- 23种设计模式——工厂模式
文章目录 23种设计模式--工厂模式 1.工厂模式概述 2.简单工厂模式 2.1.简单工厂模式的优缺点 2.2.简单工厂模式的结构 2.3.简单工厂模式的实现 3.工厂方法模式 3.1.工厂方法模式的 ...
- 23种设计模式----------代理模式(一)
代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...
- 23种设计模式——桥接模式
文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...
- 23种设计模式常用模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...
- SSM源码分析之23种设计模式(策略模式和模板模式)
23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...
- 23种设计模式----模板方法模式----行为模式
模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...
- 23种设计模式----原型模式----创建型模式
原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...
- 23种设计模式——工厂方法模式
目录 回顾简单工厂模式 工厂方法模式 优缺点 工厂方法模式VS简单工厂模式 应用场景 实例 用工厂方法模式实现计算器 导出数据 回顾简单工厂模式 可以参考我的另一篇博客 工厂类角色LightSimpl ...
最新文章
- 终于!这个强大的「开源图像识别系统」上线了!
- java版电子商务spring cloud分布式微服务b2b2c社交电商-服务容错保护(Hystrix服务降级)...
- UITableView数据更新问题
- 大厂实习生面试常问的一道算法题,LeetCode11 题目解析
- 7-27 御膳房 (5 分)
- 再谈 $* 和 $@ 在 Bash 中的表现
- HashSet,TreeSet和LinkedHashSet的区别
- IPSEC ***两个阶段的协商过程
- 兰州交通大学计算机科学与技术学院,兰州交通大学
- python提取网页中p标签中的内容_使用Python进行爬虫的初学者指南
- LeetCode 1966. Binary Searchable Numbers in an Unsorted Array
- hive与mysql的数据分区的异同
- Windows安装nginx服务
- 电视盒子刷鸿蒙系统,当贝市场亲测有效三款获取电视和盒子root权限的工具应用...
- nltk包下载慢的解决方案(总结)
- 移动硬盘安装ubuntu(UEFI)——遇到的问题以及解决方法
- 时寒冰:中国房价下跌序幕刚刚拉开
- 最简便的方法搭建Hexo+Github博客,基于Next主题
- BugkuCTF之misc题之图穷匕见
- 计算哪一年哪个月份有多少天