• 设计模式


    适配器模式定义


    将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adapee(被适配者)和Adaptor(适配者).

    为何使用


    我们经常要碰到,将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? 同时修改接口也很会破坏整个架构,这也是不可取的.

    于是我们想到使用Adapter,在两种接口之间创建一个混合接口(混血儿).
    就像笔记本的电源适配器一样.

    如何使用?


    实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).

    假设我们有两棵树,分别是苹果树和橘子树.

    public class Apple {
    
    	public void insertApple() {
    		System.out.println("insert a Apple");
    	}
    }
    
    public class Org {
    
    	public void insert() {
    		System.out.println("insert a Org");
    	}
    
    }
    

    现在有一个应用,我们既想得到苹果又想得到橘子.但是我们不知道 Apple 的源代码或者我们不想改动源代码那么我们可以使用Adapter来实现这个应用.

    public class FruitAdapter extends Org {
    	
    	private Apple apple;
    
    	public FruitAdapter (Apple apple){
    		this.apple = apple;
    	}
    
    	public void insert(){
    		apple.insertApple();
    	}
    }
    

    在上面代码中,Apple属于Adaptee,是被适配者.FruitAdapter是Adapter适配器,将Adaptee(被适配者Apple)和Target(适配者Org)进行适配.实际上这是将组合(composition)方法和继承(inheritance)方法综合使用.

    FruitAdapter首先继承Org,然后使用 new 的组合生成对象方式,生成Apple的对象Apple,再重载父类insertOrg()方法。从这里,你也了解使用 new 生成对象和使用 extends 继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.

    如果你有些Java使用的经验,已经发现,这种模式经常使用。

    进一步使用


    上面的FruitAdapter是继承了Org,如果我们需要两边继承,即继承Org 又继承Apple,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface).

    public interface IApple {
    
    	public void insertApple();
    }
    
    public interface IOrg {
    
    	public void insert();
    }
    

    下面是新的AppleOrg,除了实现接口这一区别,和上面的没有什么差别.

    public class Apple implements IApple {
    
    	public void insertApple() {
    		System.out.println("insert a Apple");
    	}
    
    }
    
    public class Org implements IOrg {
    
    	public void insert() {
    		System.out.println("insert a Org");
    	}
    
    }
    

    下面是新的FruitAdapter,叫做two-way adapter:

    public class FruitAdapter implements IApple, IOrg{
    	private Apple apple;
    	private Org org;
    	
    	public FruitAdapter (Apple apple){
    		this.apple = apple;
    	}
    
    	public FruitAdapter (Org org){
    		this.org = org;
    	}
    	
    	public void insert(){
    		apple.insertApple();
    	}
    }
    

    还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。

  • 相关阅读:
    HTTP协议中常用相应的状态码总结
    mysql 用户管理
    史上最全的mysql聚合函数总结(与分组一起使用)
    jQuery+masonry实现瀑布流
    MySQL Workbench 导入导出乱码解决方法
    在Google Maps 上点击标签显示说明并保持不消失
    在Google Maps 上点击标签后显示说明
    如何在Google Maps 添加多个标记
    如何在 Google 地图中添加标记和说明
    Google Maps API3 之 Hello World
  • 原文地址:https://www.cnblogs.com/baininghan/p/3876257.html
Copyright © 2020-2023  润新知