Adapter适配器模式--图解设计模式

第二章: Adapter 模式

 

  Adapter模式分为两种:

    1.类适配器模式

    2.委托适配器

    我看的是《图解设计模式》这本书,这小鬼子说的话真难懂,只能好好看代码理解。

 先说适配器模式要表达的什么意思,首先这个名字就很容易联想到电源适配器,一个道理,我要充电,但你不能让我直接把电线插进插座,这样肯定会冲爆,我用不了这么多电啊! 这时候就需要一个适配器,给电压转换一下充的舒舒服服的,就这意思。

    实际发开中,有一个类库写了很多方法,但我只需要其中一两个,那么就写一个适配器,把这两个方法拿出来用,要是出了Bug,就直接去Adapter里面找,而不是去翻那个类库。

    

  实际编码实现(类适配):

  Banner类所扮演的角色是(Adaptee(被适配)),它内部拥有两个方法,很简单的打印语句:

    

package example.adapter;

public class Banner {
    private String string;

    public Banner(String string) {
        super();
        this.string = string;
    }

    public void showWithPeren() {
        System.out.println("(" + string + ")");
    }

    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

 

    

   Print是需求,你需要什么?

 

package example.adapter;

public interface Print {
    
    public abstract void printWeak();

    public abstract void printStrong();
}

 

  

  PrintBanner是适配器,实现需求,继承Banner,对外提供Banner的构造和需要的方法:

  

package example.adapter;

public class PrintBanner extends Banner implements Print{



    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
        showWithPeren();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }

}

 

 

  Main测试:

package example.adapter;

public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("HelloWorld");
        p.printWeak();
        p.printStrong();
    }
}    

 

 

    实际编码实现(委托):

    将Print和PrintBanner稍作改动:

    现在,PrintBanner里面拥有了Banner的成员并在构造方法里面实例化进行调用。

package example.adapter.two;

public class PrintBanner extends Print{
    
    private Banner banner;
    
    public PrintBanner(String string) {
        super();
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
            banner.showWithPeren();
    }

    @Override
    public void printStrong() {
            banner.showWithAster();
    }



}

 

 

 

  

package example.adapter.two;

public abstract class Print {
    
    public abstract void printWeak();

    public abstract void printStrong();
}

 

 

 

  

 

 

  

  

posted @ 2018-10-02 21:41  杨超杰  阅读(1845)  评论(0编辑  收藏  举报