设计模式之适配器模式

以下情况使用适配器模式
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

160117732.jpg


其中目标接口target:

// 目标接口,或称为标准接口
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public interface Target {
    public void request();
}

被适配类Adaptee

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的被适配类
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class Adaptee {
    public void commonRequest(){
        System.out.println("common function!");
    };
}

第一种:适配器Adapter(继承模式):

// 适配器类,继承了被适配类,同时实现标准的目标接口
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class AdapterExtends extends Adaptee implements Target {
    @Override
    public void request() {
        System.out.println("after extends");
        this.commonRequest();
    }
}

第二种:适配器Adapter(组合模式):

//通过继承目标标准接口,然后讲通用的被适配类作为成员变量组合进去
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class AdapterZuhe implements Target {

    private Adaptee special;
    public AdapterZuhe(Adaptee special){
        this.special = special;
    }
    @Override
    public void request() {
        System.out.println("after zuhe!");
        special.commonRequest();
    }
}

测试类:

package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class NoteBook {
    //private Target concreteTarget;
    private Target target;
    //private Adaptee adaptee;
    public NoteBook(Target target){
        this.target = target;
    }
    public void request(){
        target.request();
    }

    public static void main(String[] args) {
        //只有一个普通的工具
        Adaptee adaptee = new Adaptee();
        //要实现特殊功能
        //方式一:采用组合的方式
        Target target = new AdapterZuhe(adaptee);
        NoteBook nb1 = new NoteBook(target);
        nb1.request();
        //方式二:采用继承的方式
        Target target2 = new AdapterExtends();
        NoteBook nb2 = new NoteBook(target2);
        nb2.request();
    }
}

最关键的一句话:继承被适配类,同时实现目标接口


你可能感兴趣的:(设计模式,适配器模式)