设计模式之——1、适配器模式

先上个总纲,二十三种设计模式

意图模式
接口型模式适配器模式、外观模式、合成模式、桥接模式
职责型模式单例模式、观察者模式、调停着模式、代理模式、职责链模式、享元模式
构造型模式构建者模式、工厂方法模式、抽象工厂模式、原型模式、备忘录模式
操作型模式模板方法模式、状态模式、策略模式、命令模式、解释器模式
扩展型模式装饰器模式、迭代器模式、访问者模式

Java设计模式中所提及的什么什么火箭例子的,吐槽一下,真的看着乱七八糟的,可能是我境界不够吧。

适配器模式意图:现有代码基本完工,客户端调用一个接口,该接口不合适,如果更改该接口则会需要大量工程,那我们就把这个接口转换成适合客户端的接口(不改动该接口)。

适用场景:现在我们后端的代码已经写好了,这时候客户端需要调用我们的对象,发现不合适,但是在其他代码中有可以满足客户端需求的代码,而且还可以重用(也不一定),那么我们对这个接口进行适配,也就是在写一个类,使之扩展该接口的功能,达到满足客户端的需求。

1.类适配器模式

原理:通过继承来实现适配器的功能。
场景:假设我们有一个小吃接口snack,这是一家小吃店总店,这里有各种小吃配方,例如煎饼果子、羊肉串配料等等。

public interface Snack {
    //配料有盐、鸡蛋
    void jianBing(String salt,String egg);
    //配料有盐、辣椒、孜然
    void mutton(String salt,String pepper,,String cumin);
}

来了一个客人,我要吃煎饼果子,我还要喝雪碧。

此时发现这个接口满足不了需求,如果我们改造这个接口,加一个雪碧,那么其他实现这个接口的类也要添加一个雪碧,还是没用的。如果客户端说我还有芬达,那么在加一个芬达,没完没了。

但是在另外一个类中,有各种各样的饮料,我们不需要重写代码,我们可以可以用这个类中的代码来满足客人的需求。

/**
*饮料类
*/
public class Drink {

    public void xueBi(){
        System.out.println("给你雪碧");
    }
    public void keLe(){
        System.out.println("给你可乐");
    }
    public void fenDa(){
        System.out.println("给你芬达");
    }
    public void guoLiCheng(){
        System.out.println("给你果粒橙");
    }
}

接下类我们来适配这个小吃接口

public class SnackAdapter extends Drink implement Snack {
    public void jianBing(String salt,String egg) {
        System.out.println("煎饼果子做好了,有"+salt+"有"+egg);
        xueBi();
    }

    public void mutton(String salt,String pepper,,String cumin) {
        System.out.println("羊肉串做好了");
     }
}

客户端:

public class client() {
    public static void main(String[] args) {
        Snack snack = new SnackAdapter();
        //来个煎饼果子和雪碧
        Snack.jianBing("盐","鸡蛋");
    }
}

总结一下:
才疏学浅,现在认识不深,用了这个设计模式,优点有:①不用改动之前代码,只需要再写一个类即可。②因为继承了Drink类,可以在一定程度上重写某些方法,更灵活。③让两个没有关联的类一起运行。④提高复用率。缺点:①单继承模式,万一我还需要方便面,那么就没办法了。

注意事项:用在代码完工或者正在服役的项目是一个好办法,如果用在正在构建中项目,不行。

2.对象适配器模式

原理:通过组合方式持有该类的实例来完成适配器。
适用环境:当客户端调用一个服务时,该类A不是一个接口(也可以是一个接口A),该类A中没有客户所要求的服务,但是另一个类B中有,这是新建一个类C来对A进行适配使之能满足客户端的需求。

还用上述例子,此时客户来小吃店买一瓶雪碧,我们这里通过持有Drink类的对象来进行适配:

/**
 * 小吃类
 */
public class Snack2 {

    public void jianBing(String salt,String egg){
        System.out.println("今天我们做煎饼果子,没有"+salt+"和"+egg);
    }

    public void mutton(String salt,String pepper,String cumin){
        System.out.println("今天我们做羊肉串,没有"+salt+"、"+cumin+"和"+pepper);
    }
}
适配器:
public class SnackAdapter2 extends Snack2{

    //持有所需服务类的对象
    private Drink drink;

    public SnackAdapter2(Drink drink) {
        this.drink = drink;
    }

    @Override
    public void jianBing(String salt, String egg) {
        drink.xueBi();
    }

    @Override
    public void mutton(String salt, String pepper, String cumin) {
        super.mutton(salt, pepper, cumin);
    }
}
客户端:
public class Client2 {
    public static void main(String[] args) {
        Snack2 snack2 = new SnackAdapter2(new Drink());
        snack2.jianBing("盐", "鸡蛋");
    }

}

输出:给你雪碧。

总结一下:
我能所想到的优点也可能不太正确,望大家指正:①通过持有类的实例可满足多个需求。②不用改动原来的代码。
缺点:①如果需要适配普通的类的话,不符合接口规范,也可能会由于重写父类导致某些隐患吧。

3.接口适配器模式

原理:通过抽象类来对目标进行适配。
应用场景:当客户端调用一个接口时客户端不需要接口A中的所有服务,我只要一个就可以,但是接口A的实现类B却实现了所有方法,即使只是一个空壳,这也浪费了资源。

用1中的例子做示例:
客户端只需要羊肉串和可乐,其他的都不需要。

抽象类实现Snack接口

public abstract class SnackAdapter3 implements Snack{

    @Override
    public void jianBing(String salt, String egg) {
    }

    @Override
    public void mutton(String salt, String pepper, String cumin) {
    }
}

适配器继承抽象类

public class SnackAdapterAbstract extends SnackAdapter3{

    private Drink drink;

    public SnackAdapterAbstract(Drink drink) {
        this.drink = drink;
    }

    @Override
    public void mutton(String salt, String pepper, String cumin) {
        System.out.println("羊肉串做好了,有"+salt+"有"+pepper+"、"+cumin);
        drink.keLe();
    }
}

客户端调用

public class Client3 {
    public static void main(String[] args) {
        SnackAdapterAbstract snack3 = new SnackAdapterAbstract(new Drink());
        snack3.mutton("胡椒粉", "辣椒粉", "孜然");
    }
}

输出:
羊肉串做好了,有胡椒粉有辣椒粉、孜然
给你可乐

总结:
三种适配器中:
①类适配器,通过继承目标类来完成。
②对象适配器,通过持有目标对象来完成。
③接口适配器,通过抽象类实现目标接口,实现类再继承目标类来完成。

当第一次看适配器模式和其他模式时发现枯燥无味想睡觉,没整明白,第二天醒来,突然间这个模式有了一定的理解,心中的疑惑少了好多。瞬间就感觉到一个字:妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值