在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

实例解析Java设计模式编程中的适配器模式使用

2016-7-29 15:34| 发布者: zhangjf| 查看: 719| 评论: 0

摘要: 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法。有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的。 ...

平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法。有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的。这个时候Adapter模式就会派上用场了。

Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。
适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器
以下举例说明:
1.类适配器

类图

2016511114620936.jpg (718×458)

  1. public class DrawRectangle {//画方
  2. public void drawRectangle(String msg) {
  3. System.out.println("draw Rectangle: " + msg);
  4. }
  5. }
  6. public interface IDrawCircle {//画圆的接口
  7. void drawCircle();
  8. }
复制代码


  1. /**
  2. * 类适配器 使用对象继承的方式,是静态的定义方式
  3. * @author stone
  4. *
  5. */
  6. public class DrawAdapter4Class extends DrawRectangle implements IDrawCircle {//既能画方又能画圆
  7. @Override
  8. public void drawCircle() {
  9. System.out.println("DrawAdapter4Class: drawCircle");
  10. }
  11. }
复制代码

2.对象适配器

类图:

2016511114706104.jpg (672×498)

  1. /**
  2. * 对象适配器: 使用对象组合的方式,是动态组合的方式。
  3. * 既能画方又能画圆
  4. * @author stone
  5. * DrawAdapter是适配器,DrawRectangle属于adapter,是被适配者,适配器将被适配者和适配目标(DrawCircle)进行适配
  6. *
  7. */
  8. public class DrawAdapter4Object implements IDrawCircle {//既能画方又能画圆
  9. private DrawRectangle drawRectangle;
  10. public DrawAdapter4Object(DrawRectangle drawRectangle) {
  11. this.drawRectangle = drawRectangle;
  12. }
  13. @Override
  14. public void drawCircle() {
  15. System.out.println("DrawAdapter4Object: drawcircle");
  16. }
  17. public void drawRectangle(String msg) {
  18. drawRectangle.drawRectangle(msg);
  19. }
  20. }
复制代码

3.接口适配器
类图

2016511114833646.jpg (414×508)

  1. /*
  2. * 接口适配器:接口中有抽象方法,我们只想实现其中的几个,不想全部实现,
  3. * 所以提供一个默认空实现,然后继承自它,重写实现我们想实现的方法
  4. */
  5. public interface IDraw {
  6. void drawCircle();
  7. void drawRectangle();
  8. }
复制代码
  1. /*
  2. * 接口适配器 的默认实现
  3. */
  4. public class DefaultDrawAdapter implements IDraw {//画方 画圆 皆为空实现
  5. @Override
  6. public void drawCircle() {
  7. }
  8. @Override
  9. public void drawRectangle() {
  10. }
  11. }
复制代码


  1. public class Test {
  2. public static void main(String[] args) {
  3. //对象适配器
  4. DrawAdapter4Object objAdapter = new DrawAdapter4Object(new DrawRectangle());
  5. objAdapter.drawCircle();
  6. objAdapter.drawRectangle(" in DrawAdapter4Object");
  7. System.out.println("--------------");
  8. //类适配器
  9. DrawAdapter4Class clzAdapter = new DrawAdapter4Class();
  10. clzAdapter.drawCircle();
  11. clzAdapter.drawRectangle("in DrawAdapter4Class");
  12. System.out.println("--------------");
  13. //接口适配器
  14. MyDrawAdapter myDrawAdapter = new MyDrawAdapter();
  15. myDrawAdapter.drawCircle();
  16. myDrawAdapter.drawRectangle();
  17. }
  18. static class MyDrawAdapter extends DefaultDrawAdapter {
  19. @Override
  20. public void drawCircle() {
  21. System.out.println("drawCircle in MyDrawAdapter");
  22. }
  23. }
  24. }
复制代码


打印

  1. DrawAdapter4Object: drawcircle
  2. draw Rectangle: in DrawAdapter4Object
  3. --------------
  4. DrawAdapter4Class: drawCircle
  5. draw Rectangle: in DrawAdapter4Class
  6. --------------
  7. drawCircle in MyDrawAdapter
复制代码


适配器模式的三个特点:

1 适配器对象实现原有接口
2 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
3 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

有人认为讲解设计模式的例子都太简单,看着感觉是那么回事,但是要是真想在项目开发中使用,还真是应用不到。其实我们不必在项目中刻意使用设计模式,而是应该从实际的设计问题出发,看哪个模式能解决我们的问题,就使用哪个模式。不要为了使用模式而使用模式,那样就舍本逐末了,一般情况下,只要遵循一定的设计原则就可以了,设计模式也是根据这些原则被总结出来的,熟悉了这些原则,模式自然而然就有了。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-4 01:44

Copyright 2015-2025 djqfx

返回顶部