JAVA设计模式《四》
经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式、代理模式和工厂模式。
适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头,而当我们遇见一个二向插口时,如何给我们的笔记本充电呢?这时我们就需要一个适配器,帮我们把二向插口转化为三向插口。接下来我们需要讨论的适配器模式,就是如同这里的二向转三向插口,下面我们就以这个现实问题,来用代码实现一下适配器模式。
1、创建三向电流接口:
/** 定义一个三相充电器接口*/ public interface ThreePathIm {//使用三相电流供电public void powerWithThree();}
2、创建三向电流类:
public class ThreePath implements ThreePathIm {public void powerWithThree() {System.out.println("使用三向电流供电\n");}}
3、创建二向电流类:
/** 二相电流类*/ public class TwoPath {public void prowerWithTwo(){System.out.println("使用二相电流供电");}}
4、创建二向接口转三向接口类(接口适配器):
/** 电源接口适配器* 二向接口适配三口接口*/ public class TwoPlugAdapt implements ThreePathIm {private TwoPath two ;public TwoPlugAdapt(TwoPath two){this.two = two;}public void powerWithThree() {System.out.println("通过适配器转化");two.prowerWithTwo();}}
5、创建继承二向电流类并实现了三向电流接口的类(继承适配器):
/** 继承适配器*/ public class extendsAdapt extends TwoPath implements ThreePathIm {public void powerWithThree() {System.out.println("\n使用继承适配器转化");this.prowerWithTwo();}}
6、创建测试类:
public class noteBook {private ThreePathIm path ;private noteBook(ThreePathIm path){this.path = path;}private void change(){path.powerWithThree();}public static void main(String [] args){ThreePathIm tpi = new ThreePath();tpi.powerWithThree();TwoPath two = new TwoPath();//获得二相接口对象ThreePathIm three = new TwoPlugAdapt(two);//把二相电流接口转为三向noteBook notebook = new noteBook(three);notebook.change();three = new extendsAdapt();notebook = new noteBook(three);notebook.change();}}
工程模式使用的场景也比较多,比如之前很火的一款名为脸萌的图片制作软件,我们可以根据我们的需要来选择头发的类型,这是如何实现的呢?下面我们来一起学习一下。
1、创建头发类型接口:
public interface Hair {public void getHair();//获得发型方法 }
2、通过该方法实现两个头发类型:
a、左偏分:
public class leftHair implements Hair {//左偏分public void getHair() {System.out.println("我的头发是左偏分");}}
b、右偏分:
public class rightHair implements Hair {//右偏分public void getHair() {System.out.println("我的头发是右偏分");}}
3、创建头发工厂:
public class hairFactory {Hair hair;//通过关键词来获得相应的头发类型类public Hair getHairKey(String key){if("left".equals(key)){hair = new leftHair();}else if("right".equals(key)){hair = new rightHair();}return hair;}//通过类地址来获得相应的头发类型类public Hair getHairClass(String cls){try {hair = (Hair)Class.forName(cls).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();}return hair;}}
4、创建测试类:
public class hairTest {/*** 测试类* @param args*/public static void main(String[] args) {Hair hair1 = new leftHair();Hair hair2 = new rightHair();hair1.getHair();hair2.getHair();//通过工厂对象进行创建类hairFactory factory = new hairFactory();Hair hair3 = factory.getHairKey("left");hair3.getHair();Hair hair4 = factory.getHairClass("cn.edu.hpu.hair.rightHair");hair4.getHair();}}
代理模式是对一个对象提供一种代理,用来控制对这个对象的控制。
下面我们通过实现一个汽车行驶时,记录行车时间和日志的功能,不多说,上代码:
1、封装一个汽车行驶的方法:
public interface MoveAble {public void move(); }
2、创建一个汽车类:
public class Car implements MoveAble {public void move(){try { // System.out.println("汽车开始行驶"); // long start = System.currentTimeMillis(); System.out.println("汽车在行驶中");Thread.sleep(new Random().nextInt(1000));//模拟汽车行驶// long end = System.currentTimeMillis(); // System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");} catch (InterruptedException e) {e.printStackTrace();}}}
3、实现一个汽车子类:
通过继承方法,创建不同子类来实现行驶时间和日志的记录。
public class Car2 extends Car {public void move() {System.out.println("汽车开始行驶");long start = System.currentTimeMillis();super.move();//执行父类的方法long end = System.currentTimeMillis();System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");}}
4、创建接口代理:
a、时间代理对象:
public class CarTimeProxy implements MoveAble {public CarTimeProxy(MoveAble m){this.m = m;}public MoveAble m;public void move() {System.out.println("汽车开始行驶");long start = System.currentTimeMillis();m.move();long end = System.currentTimeMillis();System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");}}
b、日志代理对象:
public class CarLogProxy implements MoveAble {public CarLogProxy(MoveAble m) {super();this.m = m;}public MoveAble m;public void move() {System.out.println("日志开始");m.move();System.out.println("日志结束");}}
5、测试类:
public class carTest {/*** @param 测试*/public static void main(String[] args) { // Car car = new Car(); // car.move();//继承模式的静态代理 // Car car = new Car2(); // car.move();//接口模式的静态代理,叠加操作Car car = new Car();MoveAble m1 = new CarTimeProxy(car);MoveAble m2 = new CarLogProxy(m1);m2.move();}}
6、通过JDK实现代理:
public class TimeHander implements InvocationHandler {public TimeHander(Object object) {super();this.object = object;}Object object;/** 参数:* proxy:被代理的对象* method:被代理对象的方法* args:方法的参数*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("汽车开始行驶");long start = System.currentTimeMillis();method.invoke(object, null);long end = System.currentTimeMillis();System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");return null;}}
7、JDK代理测试:
//jdk动态代理 public class Test {public static void main(String [] args){Car car = new Car();InvocationHandler hander = new TimeHander(car);Class cls = car.getClass();MoveAble m = (MoveAble) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), hander);m.move();}}
截止到本篇关于JAVA中的设计模式已经为大家分析完毕,当然这些都是很基本的东西,想真正的在开发中使用,还需要多多练习。如有疑问,可以留言讨论。
JAVA设计模式《四》相关推荐
- Java设计模式(四):工厂设计模式
1. 工厂设计模式 1.1 应用场景 由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口.使用一种封装机制来"隔离这种易变对象的变化",工厂方法定义一个用于 ...
- 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)
什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...
- 【每天一个java设计模式(十四)】 - 解释器模式
解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- Java设计模式(十二) 策略模式
策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- Java | 设计模式-适配器模式
继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...
最新文章
- 粽子机器人视频教程_包粽子服务机器人的制作方法
- 详解 javascript中offsetleft属性的用法(转)
- Form表单基础知识和常用兼容方法笔记(二)
- java设置属性的取值范围是多少_jvm-Java系统属性的范围
- javascript 动态创建表格
- python意外缩进引发逻辑错误_python – IndentationError:意外的缩进错误
- Python 中的协程 (4) asyncio模块
- 【白皮书分享】2021中国女性婚恋观白皮书.pdf(附下载链接)
- 数据爆炸时代,云存储在“破圈”!
- Arcgis Javascript那些事儿(九)--自定义infowindow
- [渝粤教育] 中国地质大学 管理信息系统 复习题 (2)
- 简单的E_mail发送
- 自建数据库与云数据库RDS具体内容的优缺点
- python encoding是什么_python中encoding什么意思
- 什么是硬件集成开发?硬件集成开发的核心有哪些?
- 实训|第十天从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理...
- ai无法启动计算机丢MSVCP100,屌丝一键重装系统之丢失MSVCP100.dll无法启动程序怎么办...
- 消防给水及消火栓系统技术规范_消防给水与消火栓系统知识点,你学会了没?...
- 计算一个月有几天并且有几个周六日的小函数
- 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程