Java實現適配器模式

適配器模式(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);
}