第二章: 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(); }