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

1 Adapter Pattern 适配器模式

目的:作为两个不兼容的接口之间的桥梁,结合两个独立接口的功能;
实现:用接口和继承或者组合的方式实现适配器模式。

1.主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的;
2.客户和被适配者是解耦的,一个不知道另一个;
3.这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。我们可以使用数个适配器,每一个都负责转换不同组的后台类。或者,也可以加上新的实现,只要它们遵守目标接口就可以。

2 实现

代码场景:吃火锅和K歌是两件不同的事,但现在可以吃着火锅唱着歌了。

2.1 代码实现

火锅接口

public interface HuoGuo {
    void eat(String type);
}

火锅实现类:海底捞

public class HaiDiLao implements HuoGuo {
    @Override
    public void eat(String whitchOne) {
        // 麻辣锅
        if ("麻辣".equals(whitchOne)) {
            maLa();
        }
        // 三鲜锅
        if ("三鲜".equals(whitchOne)) {
            sanXian();
        }
        // 鸳鸯戏水锅
        if ("鸳鸯".equals(whitchOne)) {
            yuanYang();
        }
        // 情节需要
        System.out.println("吃了一个粉带后,她放下筷子~");

    }
    private void maLa() {
        System.out.println("麻辣锅,今天上边爽,明天下边爽~");
    }
    private void sanXian() {
        System.out.println("三鲜锅,我吃的不是味道,而是菜~");
    }
    private void yuanYang() {
        System.out.println("鸳鸯锅,想吃哪个吃那个~");
    }
}

火锅实现类:小九重庆火锅

public class XiaoJiu implements HuoGuo {

    @Override
    public void eat(String whitchOne) {
        // 小九火锅只提供九宫格
        if ("九宫格".equals(whitchOne)) {
            jiuGongGe();
        }
    }

    private void jiuGongGe() {
        System.out.println("九宫格,九宫格,想放哪格放哪格~");
        // 情节需要
        System.out.println("吃了一个鱼丸后,她放下筷子~");
    }
}

Ktv接口

public interface Ktv {
    // 唱歌 想怎么唱 唱什么歌
    void sing(String how, String whitchOne);
}

适配器类:美团外卖

public class MeiTuanAdapter implements Ktv {
    private HuoGuo huoGuo;
    @Override
    public void sing(String how, String whitchOne) {
        if ("吃着火锅唱着歌".equals(how)) {
            chiHuoGuo(whitchOne);
            huoGuo.eat(whitchOne);
            // 不想增加入参了 写死一首歌 ^_^
            System.out.println("站起来,唱了一首[辣妹子辣]~");
        }
    }
    private void chiHuoGuo(String whitchOne) {
        // 打开美团外卖
        if ("九宫格".equals(whitchOne)) {
            huoGuo = new XiaoJiu();
        } else {
            huoGuo = new HaiDiLao();
        }
    }
}

Ktv实现类:周杰伦的真爱范特西ktv

public class FantasyKtv implements Ktv {
    private MeiTuanAdapter md = new MeiTuanAdapter();

    @Override
    public void sing(String how, String whitchOne) {
        if ("只唱歌".equals(how)) {
            System.out.println("她站起来,唱了一首[" + whitchOne + "]~");
            System.out.println("初听不知曲中意,再唱已是曲中人~");
        }
        if ("吃着火锅唱着歌".equals(how)) {
            //打开了美团外卖
            md.sing(how, whitchOne);
        }
    }

}

2.2 涉及角色

在适配器模式中包含如下几个角色:

Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。

Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

2.3 调用

调用者:

public class Client {
    public static void main(String[] args) {
        // 周董的真爱范特西KTV
        System.out.println("-- 三个闺蜜来到真爱范特西KTV门口 --");
        FantasyKtv fk = new FantasyKtv();
        // 决定只唱歌
        System.out.println("-- 她们决定进去唱歌  --");
        fk.sing("只唱歌", "后来");
        System.out.println("-- 她失恋一年多了还是忘不了他,旁边的闺蜜也跟着泪流不止  --");
        System.out.println("-----------分割线------------");

        // 决定吃着火锅唱着歌
        System.out.println("-- 他们决定吃着火锅唱着歌  --");
        fk.sing("吃着火锅唱着歌", "九宫格");
        System.out.println("-----------分割线-------------");
        fk.sing("吃着火锅唱着歌", "麻辣");
        System.out.println("-----------分割线-------------");
    }
}

结果:

-- 三个闺蜜来到真爱范特西KTV门口 --
-- 她们决定进去唱歌  --
她站起来,唱了一首[后来]~
初听不知曲中意,再唱已是曲中人~
-- 她失恋一年多了还是忘不了他,旁边的闺蜜也跟着泪流不止  --
-----------分割线------------
-- 他们决定吃着火锅唱着歌  --
九宫格,九宫格,想放哪格放哪格~
吃了一个鱼丸后,她放下筷子~
站起来,唱了一首[辣妹子辣]~
-----------分割线-------------
麻辣锅,今天上边爽,明天下边爽~
吃了一个粉带后,她放下筷子~
站起来,唱了一首[辣妹子辣]~

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值