介面卡模式(Adapter)
介面卡模式涉及到3個角色:要被適配的介面,介面卡,目標介面
介面卡的工作就是將被適配的介面轉換為目標介面
“鴨子型別”就是一個典型的介面卡模式:如果它走起來像鴨子,叫起來像鴨子,那麼它就是一隻鴨子。
介面卡模式示例:女兒國只有女人能加入,現在讓唐僧加入女兒國
定義要被適配的介面與目標介面
目標介面:女人介面,女人只會唱歌
public interface Female
{
void sing();
}
要被適配的介面:男人介面,男人只會打架
public interface Male
{
void fight();
}
唐僧是一個男人,只會打架,不會唱歌
public class TangSeng implements Male
{
@Override
public void fight()
{
System.out.println("阿彌陀佛");
}
}
現在,女兒國中只有女人才能加入
public class FemaleCountry
{
private final Set<Female> females;
public FemaleCountry()
{
this.females=new HashSet<>();
}
// 只有女人可以加入
public void join(Female female)
{
females.add(female);
}
}
但是,唐僧一心要加入女兒國,他有什麼辦法呢?到了介面卡出馬的時候了
// 介面卡實現目標介面
public class MaleAdapter implements Female
{
// 介面卡內部包裝了要被適配的物件
private Male male;
public MaleAdapter(Male male)
{
this.male = male;
}
// 表面是在唱歌,實際上是在打架
@Override
public void sing()
{
System.out.println("敢問聖僧,女兒美不美?");
male.fight();
}
}
現在,男人已經可以適配女人介面了,讓唐僧加入女兒國
public static void main(String[] args)
{
FemaleCountry country=new FemaleCountry();
// 用介面卡包裝
MaleAdapter tangseng=new MaleAdapter(new TangSeng());
// 唐僧也會唱歌
tangseng.sing();
// 唐僧也可以加入女兒國
country.join(tangseng);
System.out.println(country);
}