Adapter模式(适配器模式)也被称为Wrapper模式(包装模式);个人理解就是,新的接口,采用旧的方法实现。

适配器模式具有两种实现方式:

  1. 类适配器模式(使用继承旧方法的类,来实现新接口的调用);
  2. 对象适配器模式(使用委托的方法,将旧对象编程新接口实现类的一个属性,进行调用)。

实例程序1:

  • Banner类,被适配的类,即旧方法实现类
package site.wangxin520.gof.adapter.damo1;

/**
 * 使用适配器模式,将输入的字符A显示为(A)或者*A*
 * 本类即被适配的类
 * @author wangXgnaw
 *
 */
public class Banner {

    private String string;
    //构造函数传参数
    public Banner(String string){
        this.string=string;
    }
    /*
     * 被适配的方法一,展示(string)
     */
    public void showWithParen(){
        System.out.println("("+string+")");
    }
    /*
     * 被适配的方法二,展示*string*
     */
    public void showWithAster(){
        System.out.println("*"+string+"*");
    }
    
}
  • Pring接口,目标接口
package site.wangxin520.gof.adapter.damo1;

/**
 * 需求的接口,继承此接口的代码,对Banner进行适配
 * @author wangXgnaw
 *
 */
public interface Print {
    public void printWeak();
    public void printStrong();
}
  • PringBanner类,实现了目标接口的适配器,用于适配旧方法
package site.wangxin520.gof.adapter.damo1;

/**
 * 适配器,将printWeak接口方法,转换成Banner类中show***方法
 * @author wangXgnaw
 * 方式一:采用继承原来Banner类的方法
 */
public class PrintBanner extends Banner implements Print {

    /**
     * 构造函数,调用父类的构造函数
     * @param string
     */
    public PrintBanner(String string){
        super(string);
    }
    /**
     * 在新接口的实现下,调用原来的方法
     */
    public void printWeak() {
        this.showWithAster();
    }
    public void printStrong() {
        this.showWithParen();
    }

}
  • 测试类
package site.wangxin520.gof.adapter.damo1;

/**
 * 适配器模式的测试类
 * @author wangXgnaw
 *
 */
public class AdapterTest {
    
    public static void main(String[] args) {
        
        Print p=new PrintBanner("小帅哥");
        /*
         * 调用接口的方法
         */
        p.printStrong();
        p.printWeak();
        
    }
}
  • 运行结果

image

实例程序2:

  • Banner类,被适配的类,即旧方法实现类 (没有变化)
package site.wangxin520.gof.adapter.damo2;

/**
 * 使用适配器模式,将输入的字符A显示为(A)或者*A*
 * 本类即被适配的类
 * @author wangXgnaw
 *
 */
public class Banner {

    private String string;
    //构造函数传参数
    public Banner(String string){
        this.string=string;
    }
    /*
     * 被适配的方法一,展示(string)
     */
    public void showWithParen(){
        System.out.println("("+string+")");
    }
    /*
     * 被适配的方法二,展示*string*
     */
    public void showWithAster(){
        System.out.println("*"+string+"*");
    }
    
}
  • Pring接口,目标接口 (没有变化)
package site.wangxin520.gof.adapter.damo2;

/**
 * 需求的接口,继承此接口的代码,对Banner进行适配
 * @author wangXgnaw
 *
 */
public interface Print {
    public void printWeak();
    public void printStrong();
}
  • PringBanner类,实现了目标接口的适配器,用于适配旧方法 ******(重点)
package site.wangxin520.gof.adapter.damo2;

/**
 * 适配器,将printWeak接口方法,转换成Banner类中show***方法
 * @author wangXgnaw
 * 方式二:使用对象属性的方法,而不像方式一那样继承
 */
public class PrintBanner implements Print {
    
    private Banner banner;
    
    /**
     * 构造函数,调用父类的构造函数
     * @param string
     */
    public PrintBanner(String string){
        banner=new Banner(string);
    }
    /**
     * 在新接口的实现下,调用原来的方法
     */
    public void printWeak() {
        banner.showWithAster();
    }
    public void printStrong() {
        banner.showWithParen();
    }

}
  • 测试类(没有变化)
package site.wangxin520.gof.adapter.damo2;

/**
 * 适配器模式的测试类
 * @author wangXgnaw
 *
 */
public class AdapterTest {
    
    public static void main(String[] args) {
        
        Print p=new PrintBanner("小帅哥");
        /*
         * 调用接口的方法
         */
        p.printStrong();
        p.printWeak();
        
    }
}
  • 运行结果

image

 

总结:

Adapter模式会对现有的类进行适配,生成新的类。通过这种方式,可以很方便的创建出我们需要的方法群。使得代码变得简单可以适用于版本升级,接口的兼容性解决!

注意的是:目标接口和被适配的对象之间,如果功能完全不同的话,是无法使用此模式的!

posted on 2017-09-26 22:41  博客王大锤  阅读(192)  评论(0编辑  收藏  举报