资讯专栏INFORMATION COLUMN

设计模式之适配器模式

Drummor / 3034人阅读

摘要:适配器模式将一个类的接口转换为客户期望的另一个接口。取桔子包装准备用途苹果盒代替把苹果盒适配成桔子包装盒桔子包装适配器适配器模式结构图用法继承,同时组合对象引入成员变量使和产生关联。

适配器模式:将一个类的接口转换为客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

场景:水果店卖有橘子和苹果,橘子用橘子包装盒,苹果用苹果包装盒,顾客A来买橘子,但是没有橘子包装盒了,则用苹果包装盒暂时替代一下。

/**
 * 桔子
 * 
 */
public class Orange implements Fruit {
    private String name = "";
    private int price = 70;

    public Orange(String name,int price){
        this.price = price;
        this.name = name;
    }

    public void pack(OrangeBag bag){
        bag.pack();
    }

    @Override
    public int price() {
        return price;
    }

    @Override
    public void draw() {
        System.out.print("砂糖桔");
    }

    public int accept(Visit visit){
        return visit.sell(this);
    }

    public void setPrice(int price) {
        this.price = price;
    }
}



  /**
 * 桔子包装
 * 
 */
public class OrangeBag implements Bag {
    @Override
    public void pack() {
        System.out.print("--桔子使用网兜包装");
    }
}


 /**
 * 苹果包装
 * Created by Peter on 10/9 009.
 */
public class AppleBag implements Bag {
    @Override
    public void pack() {
        System.out.print("--苹果使用纸箱包装");
    }
}



 /**
 * 水果接口
 */
public interface Fruit {

    int price();

    void draw();

    int accept(Visit visit);

}

/**
 * 包装接口
 */
public interface Bag {

    void pack();

}

测试代码如下: main方法里面,new一个橘子,再获取一个橘子包装实例。
如今橘子包装没了,用苹果包装代替一下。

public class AdapterClient {
    public static void main(String[] args){
        Orange orange = new Orange("peter",100);
        OrangeBag bag = getBag2();
        orange.pack(bag);
    }

    /**
     * 取桔子包装
     * @return
     */
//    private static OrangeBag getBag(){
//        OrangeBag bag = new OrangeBag();
//        return bag;
//    }

    private static OrangeBag getBag2(){
        //准备用途苹果盒代替
        AppleBag appleBag = new AppleBag();

        //把苹果盒适配成桔子包装盒
        OrangeBag orangeBag = new OrangeBagAdapter(appleBag);

        return orangeBag;
    }
}


  /**
 * 桔子包装适配器
 */
public class OrangeBagAdapter extends OrangeBag {
    private AppleBag appleBag;

    public OrangeBagAdapter(AppleBag appleBag){
        this.appleBag = appleBag;
    }

    @Override
    public void pack() {
        appleBag.pack();
    }
}

适配器模式结构图:

用法:

1.OrangeBagAdapter继承OrangeBag,同时组合AppleBag对象(引入成员变量),使OrangeBag和AppleBag产生关联。

2.当OrangeBag目标方法被调用时,OrangeBagAdapter转调AppleBag的对象方法。

备注:OrangeBag和AppleBag都是已有类,是系统已有方法。整个过程只需要新增一个适配器类,去充当OrangeBag的实现。

这个适配器模式充满良好的OO设计原则:

1.使用了对象的组合,以修改的接口(即上文的OrangeBagAdapter的pack()方法)包装被适配者(即上文的苹果包装AppleBag);

2.这种做法还有额外的优点就是被适配者的的任何子类都可以搭配着适配器使用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74543.html

相关文章

  • 一天一个设计模式JS实现——配器模式

    摘要:本文参考于设计模式课程设计模式之适配器模式设计模式是一套被反复使用的多数人知晓的经过分类编目的代码设计经验的总结。第一个设计模式是适配器模式。总的来说适配器就是的模式,与修饰模式直接无感使用不同,适配器模式使用对象变为。 本文参考于:设计模式课程设计模式之适配器模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被...

    Aceyclee 评论0 收藏0
  • 转换插座配器模式

    摘要:适配器模式之数据格式转换适配器模式不仅可以起到适配接口名的作用,它另外还有一个功能就是能统一不同格式的作用。我们的目的就是在程序中,不要出现适配器模式,但考虑到实际,这也是不可能的,所以尽量将代码设计符合规范是非常必要的。 这个模式应该算是除了单例模式以外最简单的一个模式,没有多余的类,这个模式只有一个职责,就是转换的你接口参数,归一化接口调用函数,同意参数格式。 说人话~其实就是,将...

    MudOnTire 评论0 收藏0
  • JavaScript设计模式配器模式

    摘要:旧接口格式和使用者不兼容,中间加一个适配器转换接口。模式作用使用一个已经存在的对象,但其方法或接口不符合你的要求。 原文博客地址:https://finget.github.io/2018/11/22/adapter/ 适配器模式 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转换成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作...

    CNZPH 评论0 收藏0
  • 设计模式配器模式

    摘要:定义和类型定义将一个类的接口转换成客户期望的另一个接口,适配器模式让那些不兼容的类可以一起工作。类型结构型类适配器模式类适配器模式使用继承的方式去实现接口适配。它是适配器模式的核心。 0x01.定义和类型 定义:将一个类的接口转换成客户期望的另一个接口,适配器模式让那些不兼容的类可以一起工作。 类型:结构型 a.类适配器模式 类适配器模式:使用继承的方式去实现接口适配。 UML:...

    booster 评论0 收藏0
  • PHP设计模式配器模式

    摘要:简介适配器模式有时候也称包装样式或者包装将一个类的接口适配成用户所期待的。应用场景如程序数据库有关联等操作,而你需要根据情况换数据库操作时,可以使用适配器模式统一接口,这样代码中除了数据库配置之外,就不需要做而外的更改。 简介 适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起。 UML 角色 Tar...

    netScorpion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<