设计模式之适配器模式的学习思考

来源:互联网 发布:万方数据库下载器 编辑:程序博客网 时间:2024/06/06 02:43

适配器模式是设计模式里的结构型模式一种

其功能如其名字一样——适配,主要用于接口适配,通过接口转换,将一个类插在另一个类中

打个比方,美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。

优点:

  1. 可以让两个没有关联的类一起运行
  2. 提高了类的复用
  3. 比较灵活

缺点:

  1. 过多地使用适配器,会让系统非常零乱
  2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

思路:

  1. 创建两个接口和其实现类,分别生成不同的对象
  2. 创建适配器类,实现的接口是想要有新功能的接口,一般是低级接口,其功能是实现新功能(方法实现)
  3. 低级接口的另一个实现类内部声明适配器类对象,方法实现新功能
    4.public类main方法实现整个调用

具体设计:

  1. 我们有手机和平板两个电子设备,手机可以打电话,平板可以上网和玩游戏,现在我们想手机也可以上网和玩游戏,这时就需要一个适配器来给手机增加新功能
  2. 两个接口,一个是MobliePhone,另一个是TabletsT
  3. 先实现Tablets接口,分别是NetPlayer和GamePlayer两个类实现各自功能
  4. 创建适配类实现MobilePhone接口,其功能是隐继承Tablets的两个功能,通过构造类返回对象和方法play调用各自功能
  5. 创建MobilePlayer类实现MobilePhone接口,其功能也是隐继承适配类和实现接口方法
  6. 最后public类AdapterPatternDemo来实现main方法

具体代码:

interface MobilePhone{    void play(String functionType, String dosh);}interface Tablets{    void playNet(String dosh);    void playGame(String dosh);}class NetPlayer implements Tablets{    @Override    public void playNet(String dosh) {        // TODO Auto-generated method stub        System.out.println("Playing net Name:"+dosh);    }    @Override    public void playGame(String dosh) {        // TODO Auto-generated method stub    }}class GamePlayer implements Tablets{    @Override    public void playNet(String dosh) {        // TODO Auto-generated method stub    }    @Override    public void playGame(String dosh) {        // TODO Auto-generated method stub        System.out.println("Playing Game Name:"+dosh);    }}class Adapter implements MobilePhone{    Tablets tablets;            //接口型    public Adapter(String functionType) {        if(functionType=="net"){            tablets=new NetPlayer();        }else if(functionType=="game"){            tablets=new GamePlayer();        }    }    public void play(String functionType,String dosh){        if(functionType=="net"){            tablets.playNet(dosh);        }else if(functionType=="game"){            tablets.playGame(dosh);        }    }}class MobilePlayer implements MobilePhone{    Adapter adapter;    public void play(String functionType, String dosh) {        if(functionType=="call"){            System.out.println("Playing call Name:"+dosh);        }else if(functionType=="net"){            System.out.println("Playing net Name:"+dosh);        }else if(functionType=="game"){            System.out.println("Playing game Name:"+dosh);        }        else{            System.out.println(dosh);        }    }}public class AdapterPatternDemo {    public static void main(String[] args) {        MobilePlayer mobilePlayer=new MobilePlayer();        mobilePlayer.play("call", "打给李明");        mobilePlayer.play("net", "我在上网");        mobilePlayer.play("game", "游戏很好玩");        mobilePlayer.play("sor", "sorry");    }}

输出如下:

Playing call Name:打给李明Playing net Name:我在上网Playing game Name:游戏很好玩sorry

总结:针对接口的编程,非常具有结构型,严谨的构造顺序

原创粉丝点击