Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种:
- 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
- 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
下面简单介绍工厂模式,适配器模式和模板方法模式:
一 工厂模式
简单列一下这个模式的家族:1、静态工厂模式 2、简单工厂模式 3、工厂方法模式 4、抽象工厂模式
1、静态工厂模式
这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。
2、简单工厂模式
下面开始谈谈卖肉夹馍,得有个店:RoujiaMoStore
- package com.zhy.pattern.factory.a;
- public class RoujiaMoStore
- {
- /**
- * 根据传入类型卖不同的肉夹馍
- *
- * @param type
- * @return
- */
- public RouJiaMo sellRouJiaMo(String type)
- {
- RouJiaMo rouJiaMo = null;
- if (type.equals("Suan"))
- {
- rouJiaMo = new SuanRouJiaMo();
- } else if (type.equals("Tian"))
- {
- rouJiaMo = new TianRouJiaMo();
- } else if (type.equals("La"))
- {
- rouJiaMo = new LaRouJiaMo();
- }
- rouJiaMo.prepare();
- rouJiaMo.fire();
- rouJiaMo.pack();
- return rouJiaMo;
- }
- }
然后你得有各种风味的馍馍:
- package com.zhy.pattern.factory.a;
- public abstract class RouJiaMo
- {
- protected String name;
- /**
- * 准备工作
- */
- public void prepare()
- {
- System.out.println("揉面-剁肉-完成准备工作");
- }
- /**
- * 使用你们的专用袋-包装
- */
- public void pack()
- {
- System.out.println("肉夹馍-专用袋-包装");
- }
- /**
- * 秘制设备-烘烤2分钟
- */
- public void fire()
- {
- System.out.println("肉夹馍-专用设备-烘烤");
- }
- }
- package com.zhy.pattern.factory.a;
- import com.zhy.pattern.factory.a.RouJiaMo;
- /**
- * 辣味肉夹馍
- * @author jing
- */
- public class LaRouJiaMo extends RouJiaMo
- {
- public LaRouJiaMo()
- {
- this.name = "辣味肉夹馍";
- }
- }
- package com.zhy.pattern.factory.a;
- /**
- * 酸味肉夹馍
- *
- * @author jing
- */
- public class SuanRouJiaMo extends RouJiaMo
- {
- public SuanRouJiaMo()
- {
- this.name = "酸味肉夹馍";
- }
- }
现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。
我们开始写个简单工厂,把产生馍的过程拿出来:
- package com.zhy.pattern.factory.a;
- public class SimpleRouJiaMoFactroy
- {
- public RouJiaMo createRouJiaMo(String type)
- {
- RouJiaMo rouJiaMo = null;
- if (type.equals("Suan"))
- {
- rouJiaMo = new SuanRouJiaMo();
- } else if (type.equals("Tian"))
- {
- rouJiaMo = new TianRouJiaMo();
- } else if (type.equals("La"))
- {
- rouJiaMo = new LaRouJiaMo();
- }
- return rouJiaMo;
- }
- }
然后以组合的方式,让Store来使用:
- package com.zhy.pattern.factory.a;
- public class RoujiaMoStore
- {
- private SimpleRouJiaMoFactroy factroy;
- public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
- {
- this.factroy = factroy;
- }
- /**
- * 根据传入类型卖不同的肉夹馍
- *
- * @param type
- * @return
- */
- public RouJiaMo sellRouJiaMo(String type)
- {
- RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
- rouJiaMo.prepare();
- rouJiaMo.fire();
- rouJiaMo.pack();
- return rouJiaMo;
- }
- }
好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。
二 适配器模式 以手机充电器为例
将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以相互合作。这个定义还好,说适配器的功能就是把一个接口转成另一个接口。
代码解释哈,如题目,手机充电器一般都是5V左右吧,咱天朝的家用交流电压220V,所以手机充电需要一个适配器(降压器)
首先一部手机:Mobile.java
- package com.zhy.pattern.adapter;
- public class Mobile
- {
- /**
- * 充电
- * @param power
- */
- public void inputPower(V5Power power)
- {
- int provideV5Power = power.provideV5Power();
- System.out.println("手机(客户端):我需要5V电压充电,现在是-->" + provideV5Power + "V");
- }
- }
可以看出,手机依赖一个提供5V电压的接口:
- package com.zhy.pattern.adapter;
- /**
- * 提供5V电压的一个接口
- * @author zhy
- *
- */
- public interface V5Power
- {
- public int provideV5Power();
- }
然后我们拥有的是220V家用交流电:
- package com.zhy.pattern.adapter;
- /**
- * 家用220V交流电
- * @author zhy
- *
- */
- public class V220Power
- {
- /**
- * 提供220V电压
- * @return
- */
- public int provideV220Power()
- {
- System.out.println("我提供220V交流电压。");
- return 220 ;
- }
- }
下面我们需要一个适配器,完成220V转5V的作用:
- package com.zhy.pattern.adapter;
- /**
- * 适配器,把220V电压变成5V
- * @author zhy
- *
- */
- public class V5PowerAdapter implements V5Power
- {
- /**
- * 组合的方式
- */
- private V220Power v220Power ;
- public V5PowerAdapter(V220Power v220Power)
- {
- this.v220Power = v220Power ;
- }
- @Override
- public int provideV5Power()
- {
- int power = v220Power.provideV220Power() ;
- //power经过各种操作-->5
- System.out.println("适配器:我悄悄的适配了电压。");
- return 5 ;
- }
- }
最后测试,我们给手机冲个电:
- package com.zhy.pattern.adapter;
- public class Test
- {
- public static void main(String[] args)
- {
- Mobile mobile = new Mobile();
- V5Power v5Power = new V5PowerAdapter(new V220Power()) ;
- mobile.inputPower(v5Power);
- }
- }
输出:
现有类:我提供220V交流电压。
适配器:我悄悄的适配了电压。
手机(客户端):我需要5V电压充电,现在是-->5V
可以看出,我们使用一个适配器完成了把220V转化了5V然后提供给手机使用,且我们使用了组合(OO设计原则),原有的手机,以及200V电压类都不需要变化,且手机(客户端)和220V(被适配者)完全解耦。
三 模版方法模式 展现程序员的一天
定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座)。简单描述一下:本公司有程序猿、测试、HR、项目经理等人,下面使用模版方法模式,记录下所有人员的上班情况:
首先来个超类,超类中定义了一个workOneDay方法,设置为作为算法的骨架:
- package com.zhy.pattern.template;
- public abstract class Worker
- {
- protected String name;
- public Worker(String name)
- {
- this.name = name;
- }
- /**
- * 记录一天的工作
- */
- public final void workOneDay()
- {
- System.out.println("-----------------work start ---------------");
- enterCompany();
- computerOn();
- work();
- computerOff();
- exitCompany();
- System.out.println("-----------------work end ---------------");
- }
- /**
- * 工作
- */
- public abstract void work();
- /**
- * 关闭电脑
- */
- private void computerOff()
- {
- System.out.println(name + "关闭电脑");
- }
- /**
- * 打开电脑
- */
- private void computerOn()
- {
- System.out.println(name + "打开电脑");
- }
- /**
- * 进入公司
- */
- public void enterCompany()
- {
- System.out.println(name + "进入公司");
- }
- /**
- * 离开公司
- */
- public void exitCompany()
- {
- System.out.println(name + "离开公司");
- }
- }
定义了一个上班(算法)的骨架,包含以下步骤:
a、进入公司
b、打开电脑
c、上班情况
d、关闭电脑
e、离开公司
可以看到,a、b、d、e我们在超类中已经实现,子类仅实现work这个抽象方法,记录每天的上班情况。下面各类人物入场:
程序猿:
- package com.zhy.pattern.template;
- public class ITWorker extends Worker
- {
- public ITWorker(String name)
- {
- super(name);
- }
- @Override
- public void work()
- {
- System.out.println(name + "写程序-测bug-fix bug");
- }
- }
测试人员:
- package com.zhy.pattern.template;
- public class QAWorker extends Worker
- {
- public QAWorker(String name)
- {
- super(name);
- }
- @Override
- public void work()
- {
- System.out.println(name + "写测试用例-提交bug-写测试用例");
- }
- }
项目经理:
- package com.zhy.pattern.template;
- public class ManagerWorker extends Worker
- {
- public ManagerWorker(String name)
- {
- super(name);
- }
- @Override
- public void work()
- {
- System.out.println(name + "打dota...");
- }
- }
下面我们测试下:
- package com.zhy.pattern.template;
- public class Test
- {
- public static void main(String[] args)
- {
- Worker it1 = new ITWorker("鸿洋");
- it1.workOneDay();
- Worker pm = new ManagerWorker("坑货");
- pm.workOneDay();
- }
- }
输出结果:
- -----------------work start ---------------
- 鸿洋进入公司
- 鸿洋打开电脑
- 鸿洋写程序-测bug-fix bug
- 鸿洋关闭电脑
- 鸿洋离开公司
- -----------------work end ---------------
- -----------------work start ---------------
- 坑货进入公司
- 坑货打开电脑
- 坑货打dota...
- 坑货关闭电脑
- 坑货离开公司
- -----------------work end ---------------
原文:https://blog.csdn.net/lmj623565791/article/details/24460585
Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)的更多相关文章
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)
原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J ...
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- Java泛型使用的简单介绍
目录 一. 泛型是什么 二. 使用泛型有什么好处 三. 泛型类 四. 泛型接口 五. 泛型方法 六. 限定类型变量 七. 泛型通配符 7.1 上界通配符 7.2 下界通配符 7.3 无限定通配符 八. ...
- Java Linked集合的简单介绍和常用方法的使用
LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...
- (转)《JAVA与模式》之模板方法模式
该文章转自:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- 《JAVA与模式》之模板方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- 设计模式(七):Adapter 适配器模式 -- 结构型模式
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化. 例子1:iphone4,你即可以 ...
- 《JavaScript设计模式与开发实践》读书笔记之模板方法模式
1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Bev ...
随机推荐
- 记录一下最近的解决的坑爹bug
最近解决的bug长得都很别致啊,记录一下 一 :天气插件引用报403 项目里有一个天气插件引用一直报403 后来确定原因是headers里缺少referer源,无法访问资源的服务器,再后来又发现项目引 ...
- “妄”眼欲穿之CSS 居中问题
妄:狂妄: 不会的东西只有怀着一颗狂妄的心,假装能把它看穿吧. 作为一个什么都不会的小白,为了学习,特别在拿来主义之后写一些对于某些css布局的总结,进一步加深对知识的记忆.知识是人类的共同财富,中华 ...
- 4 - BFS & Topological Algorithm
615. Course Schedule https://www.lintcode.com/problem/course-schedule/description?_from=ladder&& ...
- LOB
一,LOB介绍 1,概念 LOB 是指用来存储大对象的数据类型,一般说LOB只是泛指,具体有BLOB,CLOB,NCLOB,BFILE. 根据你数据库的设置,一个LOB可以存储的最大大小从8TB到 ...
- LeetCode--031--下一个排列(java)*
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- .net邮件发送帮助类
代码如下: using System; using System.Collections.Generic; using System.Text; using System.Configuration; ...
- python之asyncio三种应用方法
1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...
- swoole框架和其所涉及的协议
网络知识基础 OSI协议 :应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 tcp通信 TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道(三次握手.四次挥手). ...
- 将对象转成 json 以及 将字符串 hash(SHA1) 加密
如下: /// <summary> /// 生成 Json /// </summary> /// <param name="obj"></ ...
- SqlServer 查看最近执行过的语句
查看系统中最近执行的语句 ST.text AS '执行的SQL语句', QS.execution_count AS '执行次数', QS.total_elapsed_time AS '耗时', QS. ...