上課的時候不能擼其它代碼,只能看下java設計模式的書,網上也有很多總結好的,但覺得自己總結一遍能收穫的更多,下來慢慢總結下這些設計模式。之所以叫接口型模式,是因爲這些設計模式都需要用到Interface。
適配器模式的意圖
使用不同接口的類所提供的服務爲客戶端提供它所期望的接口
Adapter之類的適配器
比如一個客戶找到黑貓要一件衣服,要求這件衣服必須要有拉鍊,釦子,高領(interface),但是黑貓我呢只有模板是拉鍊和釦子的(現有具體類),沒有高領的,但是如果重新定義滿足客戶的要求的工作是很麻煩的,而且浪費空間,不能重用,那麼現在就要用到類的適配器了,就是我們再弄一個子類來適配現有類(模板)去滿足這個interface,關係圖太麻煩,小長我還在學習中啊,直接寫個代碼總結吧
客戶要求的功能(interface)
public interface Client {
public void laLian();
public void kouZi();
public void gaoLin();
}
黑貓小長現在有的模板(現有類)
//看嘛,現在是不是沒有高領,客戶不幹啊
public class NowHave {
public void laLian(){
System.out.println("我有拉鍊");
}
public void kouZi(){
System.out.println("我有釦子");
}
}
弄個小弟來適配現有模板去滿足客戶
//你要滿足,肯定要實現這個接口澀,利用現有的模板當然要繼承他了,最後
public class Adapter extends NowHave implements Client{
@Override
public void gaoLin() {
// TODO Auto-generated method stub
System.out.println("我有高領了");
}
}
測試一下
//多態的知識,就滿足了
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Client cl = new Adapter();
cl.gaoLin();
cl.kouZi();
cl.laLian();
}
}
Adapter之對象適配器
就是咱們可以間接利用適配器類去用咱有現有類的實例,比如咱們現有模板有一個方法是吧,但是客戶要求的方法呢和這個名字不一樣,但是要用到模板裏的這個方法,咱就用適配器類來返回現有類的實例,通過這個實例調用這個需要用到的方法。直接上個例子:
要求類
//客戶要求的內容
public abstract class RequredClass {
public abstract String requiredMethod();
}
黑貓現在有的,並且是客戶要求的可以用到的
//俺現在有的類,裏面有個方法呢是要求類要用到的
public class ExistClass {
public String userfulMethod(){
/*
*內容
*/
return null;
}
}
適配唄
//咱們來適配
public class Adapter extends RequredClass{
//既然是對象適配器,要用到已有類的對象澀,定義一個先
private ExistClass existClass;
public Adapter(ExistClass existClass){
this.existClass = existClass;
}
@Override
public String requiredMethod() {
// TODO Auto-generated method stub
return existClass.userfulMethod();
}
}
對象適配器更加脆弱
爲啥子呢?對象適配器,俺們的適配器類沒有繼承接口,沒有接口的約束,可能在運行時出現編譯時無法檢測到的問題,而且俺們不能想訪問現有類的屬性或方法,不能保證咱們現有類的屬性或方法的聲明方式,很難約束控制它們要做的事情。
Adapter之缺省適配器
就是客戶本來要求很多功能,但是現在只需要一個功能了,不多說,直接上代碼
要求的接口
//目標接口
public interface Target {
public void method1();
public void method2();
public void method3();
}
再定義一個類繼承上面的(只是一箇中間過渡類)
public class GuoDu implements Target{
//所有方法不必去實現
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method3() {
// TODO Auto-generated method stub
}
}
客戶只要method3的功能,咱們就只有method3澀
public class FunctionClass extends GuoDu {
public void method3(){
/*
* 具體功能
* */
}
}
再來一個測試類
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Target target = new FunctionClass();
target.method2();
}
}
//你去調用method1和method2是沒有效果的,因爲俺們的功能類沒有實現這個,這就是需要哪個,咱就重寫哪個方法
Adapter應用場景
如果一個抽象類或者接口的話,就必須要重寫所有的抽象方法。
那麼,如果一個接口中定義的抽象方法過多,而子類中很多抽象方法又不需要用到,就應該設計一個適配器。在JAVA的GUI編程中,jdk就自動封裝了多個適配器。比如: windowAdapter。