设计模式之适配器模式

来源:互联网 发布:西卡的淘宝店 编辑:程序博客网 时间:2024/05/29 07:51

适配器模式能够将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色:
1、目标接口(People):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
2、 需要适配的类(AlQaida /CIA):需要适配的类或适配者类。
3 、适配器(GodSon):通过包装一个需要适配的对象,把原接口转换成目标接口。
对类进行适配example:

//需要适配的对象(聪明人)public class SmartMan{    public void lie() {        System.out.println("满嘴跑火车");    }    public void sayTruth(){        System.out.println("说真话,得罪人");    }    public void getInfomation() {      System.out.println("获取有用信息。。。。");    }}
//适配器接口public interface People{  void work();  void fun();}
//适配器类(基地组织)public class AlQaida implements People {  private SmartMan spy;  public AlQaida() {    spy= new Spy();  }  @Override  public void work() {    spy.getInfomation();  }  @Override  public void fun() {    System.out.println("任务来了,去CIA混个领导玩玩儿");    spy.lie();    System.out.println("获得CIA高级指挥官权限");  }}
//适配器类(中央情报局)public class CIA implements People{  private SmartMan cop;  public CIA() {    cop= new cop();  }  @Override  public void work() {    cop.getInfomation();    System.out.println("捣毁al-qaida");  }  @Override  public void fun() {       System.out.println("打入al-qaida内部");       cop.lie();       System.out.println("成功侵入al-qaida");  }}
//适配器客户端(上帝调用这些个CIA或AlQaida到处捣乱)public class GodSon implements People{     private People people;    public GodSon () {    }    public GodSon (People people) {        this.people= people;    }    public void setPeople(People people) {        this.people= people;    }    @Override    public void work() {        people.work();    }    @Override    public void getInfomation() {        people.getInfomation();    }    public static void main(String[] args){        GodSon god= new GodSon (new CIA());        god.fun();        god.work();    }}

对接口进行适配example:

/** * 德标接口 */public interface DBSocketInterface {    /**     * 这个方法的名字叫做:使用两项圆头的插口供电     * 本人英语就这个水平     */    void powerWithTwoRound();}
/** * 德国插座 */public class DBSocket implements DBSocketInterface{    public void powerWithTwoRound(){        System.out.println("使用两项圆头的插孔供电");    }}
/** * 国标接口 */public interface GBSocketInterface {    /**     * 这个方法的名字叫做:使用三项扁头的插口供电     * 本人英语就这个水平,从有道词典查得, flat意思好像是: 扁的     */    void powerWithThreeFlat();}
/** * 中国插座 */public class GBSocket implements GBSocketInterface{    @Override    public void powerWithThreeFlat() {        System.out.println("使用三项扁头插孔供电");    }}
public class SocketAdapter          implements DBSocketInterface{   //实现旧接口    //组合新接口    private GBSocketInterface gbSocket;    /**     * 在创建适配器对象时,必须传入一个新街口的实现类     * @param gbSocket     */    public SocketAdapter(GBSocketInterface gbSocket) {        this.gbSocket = gbSocket;    }    /**     * 将对就接口的调用适配到新接口     */    @Override    public void powerWithTwoRound() {        gbSocket.powerWithThreeFlat();    }}
/** * 德国宾馆 */public class Hotel {    //旅馆中有一个德标的插口    private DBSocketInterface dbSocket;    public Hotel(){}    public Hotel(DBSocketInterface dbSocket) {        this.dbSocket = dbSocket;    }    public void setSocket (DBSocketInterface dbSocket){        this.dbSocket = dbSocket;    }    //旅馆中有一个充电的功能    public void charge(){        //使用德标插口充电        dbSocket.powerWithTwoRound();    }}
public class TestAdapter {    public static void main(String[] args) {        GBSocketInterface gbSocket = new GBSocket();        Hotel hotel = new Hotel();        SocketAdapter socketAdapter = new SocketAdapter(gbSocket);        hotel.setSocket(socketAdapter);        hotel.charge();    }}

适配器优缺点:
优点:
1、通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2、复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4、一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点:
对于对象适配器来说,更换适配器的实现过程比较复杂。

使用场景:
1、系统需要使用现有的类,而这些类的接口不符合系统的接口。
2、想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3、两个类所做的事情相同或相似,但是具有不同接口的时候。
4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
5、使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能

0 0