设计模式---适配器模式

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。

适配器模式分为两种,一种是对象适配器,一种是类适配器,下面通过火鸡冒充鸭子的案例,讲述这两个模式

问题:火鸡冒充鸭子,某公司一开始是做火鸡的,但是因为运营问题,现在需要做鸭子,如果重写代码的话,那么开发成本将会是很高的,所以要用火鸡冒充鸭子.

//实现鸭子的接口
    public interface Duck{
        public void name1();
        public void fly1();
    }
//鸭子
    class BlueDuck implements Duck{

        @Override
        public void name1() {
            System.out.println("I am blueduck");
        }

        @Override
        public void fly1() {
            System.out.println("I can fly a long distance");
        }

    }
//实现火鸡的接口
    public interface Turkey{
        public void name2();
        public void fly2();
    }
//火鸡
    class RedTurkey implements Turkey{

        @Override
        public void name2() {
            System.out.println("I am RedTurkey");
        }

        @Override
        public void fly2() {
            System.out.println("I can fly a short distance");
        }
    }

下面是对象适配器,主要是用对象来操作模拟

/**
     * 情景:用火鸡冒充鸭子
     * 1.对象适配,主要是通过对象来实现模拟方法
     */
    class TurkeyAdapter1 implements Duck{


        RedTurkey turkey;

        public TurkeyAdapter1(RedTurkey turkey) {
            this.turkey = turkey;
        }

        @Override
        public void fly1() {
            turkey.fly2();
        }

        @Override
        public void name1() {
            turkey.name2();
        }

    }

下面是类适配器,通过实现超类的方法来进行模拟

/**
     * 用火鸡冒充鸭子
     * 2.类适配器,主要是调用父类的方法来实现模拟
     */
    class RedTurkey2 extends RedTurkey implements Duck{

        @Override
        public void name1() {
            super.name2();
        }

        @Override
        public void fly1() {
            super.fly2();
        }

    }

1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。

2.适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-08-26 20:00  牛李  阅读(199)  评论(0编辑  收藏  举报

导航