您的位置:首页 > 其它

【设计模式】学习笔记9:适配器模式(Adapter)

2013-08-13 00:19 513 查看
本文出自 http://blog.csdn.net/shuangde800

生活中的适配器

在现实生活中,如果你需要在欧洲国家使用美国制造的笔记本电脑,那么你可能需要使用一个交流电的适配器。

因为欧洲的插座和美国笔记本电脑的插头不一样,所以需要一个交流电适配器,通过这个美国笔记本插头就可以使用欧洲插座了。

OO适配器和真实世界的适配器扮演着同样的角色:将一个接口转换成另一个接口,以符合客户的期望。

第一个适配器模式

有一个鸭子接口:

// 有呱呱叫和飞行的功能
public interface Duck {
    public void quack();
    public void fly();
}


实现一个鸭子子类:

public class MallardDuck implements Duck {
    public void quack() {
        System.out.println("呱呱");
    }

    public void fly() {
        System.out.println("我在飞"); 
    }
}


还有一个火鸡的接口:

public interface Turkey {
    public void gobble();
    public void fly();
}


实现一个野生火鸡:

public class WildTurkey implements Turkey {
	public void gobble() {
		System.out.println("Gobble gobble");
	}
 
	public void fly() {
		System.out.println("I'm flying a short distance");
	}
}


假设你缺少一个鸭子对象,想用火鸡对象来冒充,可以吗?
显而易见,因为火鸡的接口不同,所以不能公然拿来用

那就写一个适配器吧!

// 需要实现想转换成的类型接口
public class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turykey; 
    }

    public void quack() {
        turkey.gobble(); 
    }

    public void fly() {
        // 火鸡飞行比较短,所以连飞5次
        for(int i = 0; i < 5; ++i) {
            turkey.fly(); 
        } 
    }
}


然后就可以把火鸡通过适配器给鸭子的引用使用了!

public class DuckTestDrive {
	public static void main(String[] args) {
		MallardDuck duck = new MallardDuck();
 
		WildTurkey turkey = new WildTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);
   
		System.out.println("The Turkey says...");
		turkey.gobble();
		turkey.fly();
 
		System.out.println("\nThe Duck says...");
		testDuck(duck);
  
		System.out.println("\nThe TurkeyAdapter says...");
		testDuck(turkeyAdapter);
	}
 
	static void testDuck(Duck duck) {
		duck.quack();
		duck.fly();
	}
}




定义适配器模式

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

1、 适配器模式可以让不兼容的接口变成兼容的。

2、让客户从实现的接口解耦

3、适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。这种方法还有额外的有点,被适配者的任何子类,都可以搭配着适配器使用
4、这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。



适配器分为两种:

1、对象适配器

2、类适配器

类适配器需要多重继承才能实现它,在Java中是不可能的。但是在使用多重继承语言,还是可能遇到这种续期的。

下面是类适配器的类图:



对象适配器的类图:



类适配器和对象适配器的差别在于使用两种不同的适配方法,类适配器是用继承,而对象适配器是用组合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: