我有一台笔记本电脑,但是我想接着电源用,交流电是220v,我电脑是19v,我总不能直接就插上去用吧,我需要一种装置可以让我19v的电脑用上220v的交流电,厂家给我配了变压器,用术语讲就是适配器。
适配器模式有两种实现方式,一种是继承,另一种是委托。
先看继承方式:
/** * Banner.java<br> * 原有类,此类相当于交流电压220v * @author cool * */public class Banner { private String s; public Banner(String s) { this.s=s; } /** * 将字符串放在小括号内输出,减弱的意思 */ public String showWithParen() { return "("+s+")"; } /** * 将字符串前后都加星号输出,加强的意思 */ public String showWithAster() { return "*"+s+"*"; }}
/** * Print.java<br> * 要使用的接口,相当于直流电12v电压 * @author cool * */public interface Print { /** * 减弱输入 */ public abstract String printWeak(); /** * 加强输出 */ public abstract String printStrong();}
/** * PrintBanner.java<br> * 变压器,就是一个适配器 * @author cool * */public class PrintBanner extends Banner implements Print { public PrintBanner(String s) { super(s); } /** * 加强输出 */ public String printStrong() { return super.showWithAster(); } /** * 减弱输入 */ public String printWeak() { return super.showWithParen(); }}
import static org.junit.Assert.*;
import org.junit.*;
/** * 测试用例 * @author cool * */public class PrintTest { private Print p; @Before public void setUp() throws Exception { p=new PrintBanner("hello"); }
@After public void tearDown() throws Exception { }
@Test public void testPrintWeak() { assertEquals("AssertionError","(hello)",p.printWeak()); }
@Test public void testPrintStrong() { assertEquals("AssertionError","*hello*",p.printStrong()); }
}
下面是委托,其实适配器就是使用引用或称聚合:
/** * Banner.java<br> * 原有类,此类相当于交流电压220v * @author cool * */public class Banner { private String s; public Banner(String s) { this.s=s; } /** * 将字符串放在小括号内输出,减弱的意思 */ public String showWithParen() { return "("+s+")"; } /** * 将字符串前后都加星号输出,加强的意思 */ public String showWithAster() { return "*"+s+"*"; }}
/** * Print.java<br> * 改为抽象类,相当于直流电12v电压 * @author cool * */public abstract class Print { /** * 减弱输入 */ public abstract String printWeak(); /** * 加强输出 */ public abstract String printStrong();}
/** * PrintBanner.java<br> * 变压器,就是一个适配器 * @author cool * */public class PrintBanner extends Print { private Banner banner; public PrintBanner(String s) { banner=new Banner(s); } /** * 加强输出 */ public String printStrong() { return banner.showWithAster(); } /** * 减弱输入 */ public String printWeak() { return banner.showWithParen(); }}
import static org.junit.Assert.*;
import org.junit.*;
/** * 测试用例 * @author cool * */public class PrintTest { private Print p; @Before public void setUp() throws Exception { p=new PrintBanner("hello"); }
@After public void tearDown() throws Exception { }
@Test public void testPrintWeak() { assertEquals("AssertionError","(hello)",p.printWeak()); }
@Test public void testPrintStrong() { assertEquals("AssertionError","*hello*",p.printStrong()); }
}