经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式、代理模式和工厂模式。

  适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头,而当我们遇见一个二向插口时,如何给我们的笔记本充电呢?这时我们就需要一个适配器,帮我们把二向插口转化为三向插口。接下来我们需要讨论的适配器模式,就是如同这里的二向转三向插口,下面我们就以这个现实问题,来用代码实现一下适配器模式。

 1、创建三向电流接口:

  1. /*
  2. * 定义一个三相充电器接口
  3. */
  4. public interface ThreePathIm {
  5.  
  6. //使用三相电流供电
  7. public void powerWithThree();
  8.  
  9. }

 2、创建三向电流类:

  1. public class ThreePath implements ThreePathIm {
  2.  
  3. public void powerWithThree() {
  4. System.out.println("使用三向电流供电\n");
  5. }
  6.  
  7. }

 3、创建二向电流类:

  1. /*
  2. * 二相电流类
  3. */
  4. public class TwoPath {
  5.  
  6. public void prowerWithTwo(){
  7. System.out.println("使用二相电流供电");
  8. }
  9.  
  10. }

 4、创建二向接口转三向接口类(接口适配器):

  1. /*
  2. * 电源接口适配器
  3. * 二向接口适配三口接口
  4. */
  5. public class TwoPlugAdapt implements ThreePathIm {
  6.  
  7. private TwoPath two ;
  8.  
  9. public TwoPlugAdapt(TwoPath two){
  10. this.two = two;
  11. }
  12.  
  13. public void powerWithThree() {
  14. System.out.println("通过适配器转化");
  15. two.prowerWithTwo();
  16. }
  17.  
  18. }

 5、创建继承二向电流类并实现了三向电流接口的类(继承适配器):

  1. /*
  2. * 继承适配器
  3. */
  4. public class extendsAdapt extends TwoPath implements ThreePathIm {
  5.  
  6. public void powerWithThree() {
  7. System.out.println("\n使用继承适配器转化");
  8. this.prowerWithTwo();
  9. }
  10.  
  11. }

 6、创建测试类:

  1. public class noteBook {
  2.  
  3. private ThreePathIm path ;
  4.  
  5. private noteBook(ThreePathIm path){
  6. this.path = path;
  7. }
  8.  
  9. private void change(){
  10. path.powerWithThree();
  11. }
  12.  
  13. public static void main(String [] args){
  14.  
  15. ThreePathIm tpi = new ThreePath();
  16. tpi.powerWithThree();
  17.  
  18. TwoPath two = new TwoPath();//获得二相接口对象
  19. ThreePathIm three = new TwoPlugAdapt(two);//把二相电流接口转为三向
  20. noteBook notebook = new noteBook(three);
  21. notebook.change();
  22.  
  23. three = new extendsAdapt();
  24. notebook = new noteBook(three);
  25. notebook.change();
  26. }
  27.  
  28. }

  工程模式使用的场景也比较多,比如之前很火的一款名为脸萌的图片制作软件,我们可以根据我们的需要来选择头发的类型,这是如何实现的呢?下面我们来一起学习一下。
 1、创建头发类型接口:

  1. public interface Hair {
  2.  
  3. public void getHair();//获得发型方法
  4.  
  5. }

 2、通过该方法实现两个头发类型:

  a、左偏分:

  1. public class leftHair implements Hair {
  2.  
  3. //左偏分
  4. public void getHair() {
  5. System.out.println("我的头发是左偏分");
  6. }
  7.  
  8. }

  b、右偏分:

  1. public class rightHair implements Hair {
  2.  
  3. //右偏分
  4. public void getHair() {
  5. System.out.println("我的头发是右偏分");
  6. }
  7.  
  8. }

 3、创建头发工厂:

  1. public class hairFactory {
  2.  
  3. Hair hair;
  4.  
  5. //通过关键词来获得相应的头发类型类
  6. public Hair getHairKey(String key){
  7. if("left".equals(key)){
  8. hair = new leftHair();
  9. }else if("right".equals(key)){
  10. hair = new rightHair();
  11. }
  12. return hair;
  13. }
  14.  
  15. //通过类地址来获得相应的头发类型类
  16. public Hair getHairClass(String cls){
  17. try {
  18. hair = (Hair)Class.forName(cls).newInstance();
  19. } catch (InstantiationException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. } catch (IllegalAccessException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. } catch (ClassNotFoundException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29. return hair;
  30. }
  31.  
  32. }

 4、创建测试类:

  1. public class hairTest {
  2.  
  3. /**
  4. * 测试类
  5. * @param args
  6. */
  7. public static void main(String[] args) {
  8. Hair hair1 = new leftHair();
  9. Hair hair2 = new rightHair();
  10. hair1.getHair();
  11. hair2.getHair();
  12.  
  13. //通过工厂对象进行创建类
  14. hairFactory factory = new hairFactory();
  15. Hair hair3 = factory.getHairKey("left");
  16. hair3.getHair();
  17.  
  18. Hair hair4 = factory.getHairClass("cn.edu.hpu.hair.rightHair");
  19. hair4.getHair();
  20. }
  21.  
  22. }

  代理模式是对一个对象提供一种代理,用来控制对这个对象的控制。

  

  下面我们通过实现一个汽车行驶时,记录行车时间和日志的功能,不多说,上代码:

 1、封装一个汽车行驶的方法:

  1. public interface MoveAble {
  2. public void move();
  3. }

 2、创建一个汽车类:

  1. public class Car implements MoveAble {
  2.  
  3. public void move(){
  4. try {
  5. // System.out.println("汽车开始行驶");
  6. // long start = System.currentTimeMillis();
  7.  
  8. System.out.println("汽车在行驶中");
  9. Thread.sleep(new Random().nextInt(1000));//模拟汽车行驶
  10.  
  11. // long end = System.currentTimeMillis();
  12. // System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. }

 3、实现一个汽车子类:

  通过继承方法,创建不同子类来实现行驶时间和日志的记录。

  1. public class Car2 extends Car {
  2.  
  3. public void move() {
  4. System.out.println("汽车开始行驶");
  5. long start = System.currentTimeMillis();
  6.  
  7. super.move();//执行父类的方法
  8.  
  9. long end = System.currentTimeMillis();
  10. System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
  11. }
  12.  
  13. }

 4、创建接口代理:

  a、时间代理对象:

  1. public class CarTimeProxy implements MoveAble {
  2.  
  3. public CarTimeProxy(MoveAble m){
  4. this.m = m;
  5. }
  6.  
  7. public MoveAble m;
  8.  
  9. public void move() {
  10.  
  11. System.out.println("汽车开始行驶");
  12. long start = System.currentTimeMillis();
  13.  
  14. m.move();
  15.  
  16. long end = System.currentTimeMillis();
  17. System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
  18. }
  19.  
  20. }

  b、日志代理对象:

  1. public class CarLogProxy implements MoveAble {
  2.  
  3. public CarLogProxy(MoveAble m) {
  4. super();
  5. this.m = m;
  6. }
  7.  
  8. public MoveAble m;
  9.  
  10. public void move() {
  11. System.out.println("日志开始");
  12. m.move();
  13. System.out.println("日志结束");
  14. }
  15.  
  16. }

 5、测试类:

  1. public class carTest {
  2.  
  3. /**
  4. * @param 测试
  5. */
  6. public static void main(String[] args) {
  7. // Car car = new Car();
  8. // car.move();
  9.  
  10. //继承模式的静态代理
  11. // Car car = new Car2();
  12. // car.move();
  13.  
  14. //接口模式的静态代理,叠加操作
  15. Car car = new Car();
  16. MoveAble m1 = new CarTimeProxy(car);
  17. MoveAble m2 = new CarLogProxy(m1);
  18. m2.move();
  19. }
  20.  
  21. }

 6、通过JDK实现代理:

  1. public class TimeHander implements InvocationHandler {
  2.  
  3. public TimeHander(Object object) {
  4. super();
  5. this.object = object;
  6. }
  7.  
  8. Object object;
  9.  
  10. /*
  11. * 参数:
  12. * proxy:被代理的对象
  13. * method:被代理对象的方法
  14. * args:方法的参数
  15. */
  16. public Object invoke(Object proxy, Method method, Object[] args)
  17. throws Throwable {
  18.  
  19. System.out.println("汽车开始行驶");
  20. long start = System.currentTimeMillis();
  21.  
  22. method.invoke(object, null);
  23.  
  24. long end = System.currentTimeMillis();
  25. System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
  26.  
  27. return null;
  28. }
  29.  
  30. }

 7、JDK代理测试:

  1. //jdk动态代理
  2. public class Test {
  3. public static void main(String [] args){
  4. Car car = new Car();
  5. InvocationHandler hander = new TimeHander(car);
  6. Class cls = car.getClass();
  7.  
  8. MoveAble m = (MoveAble) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), hander);
  9. m.move();
  10. }
    }

  截止到本篇关于JAVA中的设计模式已经为大家分析完毕,当然这些都是很基本的东西,想真正的在开发中使用,还需要多多练习。如有疑问,可以留言讨论。

JAVA设计模式《四》的更多相关文章

  1. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  2. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. 深入探索Java设计模式(四)之享元模式

    享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...

  5. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  6. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

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

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. JAVAWEB学习

    http://www.cnblogs.com/xdp-gacl/p/3744053.html JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)

  2. Java实现四则运算,使用堆栈,检查语法

    突然发闲想试一试自己实现算术的四则运算,支持加减乘除和括号.正负号:支持语法检查:思路很常规,利用两个堆栈,一个压操作符,一个压操作数,念头冒出来之后,立马动手:然后本以为很容易的一个实现,却存在各种 ...

  3. 在VS2010下编译和使用tesseract_ocr识别验证码

    对于自动识别验证码,使用trsseract是个不错的选择,有兴趣的的朋友可以试试. 编译tesseract 官网提供了vs2008的编译说明和工程,但在vs2010下的编译时基本相同的,因此我使用的方 ...

  4. NGUI 3.0.7的新锚点系统设置不好就会造成显示错误的错觉

    每次设置NGUI控件的锚点时,都需要刷新一下窗口,不然就会造成显示错误的错觉. 同时,NGUI控件设置锚点的参考对象为一个物体时还需要调整其控件大小,不然也会造成显示错误的错觉.

  5. adapter.notifyDataSetChanged(); 没有反应

    为什么是这样,以下是我总结的一些原因: 1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. ...

  6. spring MVC原理

    spring MVC原理   Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...

  7. 《Python标准库》 目录

    目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...

  8. HTML5-样式

    外部样式,内部样式,内链样式 <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...

  9. 原生Ajax封装随笔

    XMLHttpRequest 对象用于和服务器交换数据.我们使用 XMLHttpRequest 对象的 open() 和 send() 方法: open(method,url,async) metho ...

  10. Sql Server tempdb原理-缓存机制解析实践

    Tempdb就像Sqlserver的临时仓库,各式各样的对象,数据在里面进行频繁计算,操作.大量的操作使得tempdb可能面临很大压力,tempdb中缓存的设计就是为了缓解这些压力.这次就为大家介绍下 ...