Java-设计模式-第二篇-适配器模式

本人所学设计模式皆出自于 结城浩先生的《图解设计模式》。

Adapter模式也被成为Wrapper模式

类图

    类适配器模式


    对象适配器模式


为什么使用Adapter模式

    当现有的类已经被充分测试过,bug很少,而且已经被用于其他软件之中,我们更愿意对这些类作为组件重复利用,Adapter模式会对现有的类进行适配,生成新的类。通过该模式我们可以方便的创建我们需要的方法群,当出现bug时,由于我们很明确bug不是现有的类,所以只需要调查Adapter即可,代码问题排查也会非常简单。

举例代码

    类适配器

package com.qiang.model;

/**
 * 已经存在的人类
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Person {
    protected void singing() {
        System.out.print("singing");
    }

    protected void dancing() {
        System.out.print("dancing");
    }
}
package com.qiang.demand;

/**
 * 需求接口
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public interface Human {
    /**
     * 唱歌和跳舞
     */
    void singingAndDancing();

    /**
     * 跳舞和唱歌
     */
    void dancingAndSinging();
}
package com.qiang;

import com.qiang.demand.Human;
import com.qiang.model.Person;

/**
 * 适配器
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Adapter extends Person implements Human {
    @Override
    public void singingAndDancing() {
        singing();
        System.out.println(" And Dancing");
    }

    @Override
    public void dancingAndSinging() {
        dancing();
        System.out.println(" And Singing");
    }
}
package com.qiang;

import com.qiang.demand.Human;

/**
 * 测试
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Test {
    public static void main(String[] args) {
        Human human = new Adapter();
        human.dancingAndSinging();
        human.singingAndDancing();
    }
}

        结果

dancing And Singing
singing And Dancing

    对象适配器

package com.qiang.demand;

/**
 * 需求
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public abstract class AbstractHuman {
    /**
     * 唱歌和跳舞
     */
    public abstract void singingAndDancing();

    /**
     * 跳舞和唱歌
     */
    public abstract void dancingAndSinging();
}
package com.qiang.model;

/**
 * 已经存在的人类
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Person {
    public void singing() {
        System.out.print("singing");
    }

    public void dancing() {
        System.out.print("dancing");
    }
}
package com.qiang;

import com.qiang.demand.AbstractHuman;
import com.qiang.model.Person;

/**
 * 适配器
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Adapter extends AbstractHuman {

    private Person person;

    public Adapter() {
        this.person = new Person();
    }

    @Override
    public void singingAndDancing() {
        person.singing();
        System.out.println(" And Dancing");
    }

    @Override
    public void dancingAndSinging() {
        person.dancing();
        System.out.println(" and Singing");
    }
}
package com.qiang;


import com.qiang.demand.AbstractHuman;

/**
 * 测试
 *
 * @author zhangxinqiang
 * @date 2018/2/10
 */
public class Test {
    public static void main(String[] args) {
        AbstractHuman human = new Adapter();
        human.singingAndDancing();
        human.dancingAndSinging();
    }
}

        结果

singing And Dancing
dancing and Singing
我通过2种方式对Person类到Human/AbstractHuman类进行了适配或者说包装,在通过调用已存在的类完成新需求的情况下并没有对原有的类进行修改,通过这种方式完成了代码的复用,更安全,并且有效减少bug量及代码冗余。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值