经过前几篇的介绍相信大家对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设计模式《四》相关推荐

  1. Java设计模式(四):工厂设计模式

    1. 工厂设计模式 1.1 应用场景 由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口.使用一种封装机制来"隔离这种易变对象的变化",工厂方法定义一个用于 ...

  2. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

    什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...

  3. 【每天一个java设计模式(十四)】 - 解释器模式

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...

  4. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  5. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  6. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  7. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  8. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

  9. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  10. Java | 设计模式-适配器模式

    继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...

最新文章

  1. 粽子机器人视频教程_包粽子服务机器人的制作方法
  2. 详解 javascript中offsetleft属性的用法(转)
  3. Form表单基础知识和常用兼容方法笔记(二)
  4. java设置属性的取值范围是多少_jvm-Java系统属性的范围
  5. javascript 动态创建表格
  6. python意外缩进引发逻辑错误_python – IndentationError:意外的缩进错误
  7. Python 中的协程 (4) asyncio模块
  8. 【白皮书分享】2021中国女性婚恋观白皮书.pdf(附下载链接)
  9. 数据爆炸时代,云存储在“破圈”!
  10. Arcgis Javascript那些事儿(九)--自定义infowindow
  11. [渝粤教育] 中国地质大学 管理信息系统 复习题 (2)
  12. 简单的E_mail发送
  13. 自建数据库与云数据库RDS具体内容的优缺点
  14. python encoding是什么_python中encoding什么意思
  15. 什么是硬件集成开发?硬件集成开发的核心有哪些?
  16. 实训|第十天从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理...
  17. ai无法启动计算机丢MSVCP100,屌丝一键重装系统之丢失MSVCP100.dll无法启动程序怎么办...
  18. 消防给水及消火栓系统技术规范_消防给水与消火栓系统知识点,你学会了没?...
  19. 计算一个月有几天并且有几个周六日的小函数
  20. 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程

热门文章

  1. Sql Like 通配符 说明
  2. 测试基础-07-测试报告编写
  3. 设计模式的七大设计原则:其二:接口隔离原则
  4. 接口测试工具--apipost预/后执行脚本
  5. 基于 jmeter 的分布式性能测试实战
  6. python基础之字符串定义常见操作、列表定义进阶操作
  7. 技巧 | 如何使用R语言的基础绘图系统的拼图功能
  8. python系统信息_Python获得操作系统信息
  9. 程序员,学会这些技能让你的薪资翻倍!
  10. html5和html的区别是什么?学HTML5要不要学html?