java中的适配器模式

以下是我现阶段对适配器模式的认识:


先谈一下什么是适配器

拿我一直想买但是又没钱买的苹果笔记本举例,苹果笔记本据说没有USB接口,但是我又有一个超级牛的机械键盘cherry 8.0是USB接口的。

但是,我既想用苹果笔记本,又想用我的cherry 8.0,这时候我就需要买一个适配器,也就是说,我本来有一个类(苹果笔记本),但是这个类我直接拿来用不了,因为他提供的接口不是USB接口,这时候我需要一个适配器,将这个类(或者接口)转化成我可以直接使用形式。

注意这里还有一种适配器,他是苹果的口转各种口。有点像HUB的那种转换头。如下图:



下面介绍适配器模式中的登场角色:

1.Target(对象)

该角色负责定义所需的方法。在我的这个例子中就是上面那张图片所显示的,整个适配器设备,由Print(这个Print可以是接口也可以是抽象类,后面我将针对这两种情况进行详细的讨论)扮演该角色。

2.Client(请求者)

该角色负责使用Target角色所定义的方法进行具体的处理。在我的这个例子中是樱桃键盘,在示例程序中,由Main类扮演此角色。

3.Adaptee(被适配)

注意!这里是被适配,在我的例子中是苹果笔记本,在示例程序中由Banner类扮演此角色。

4.Adapter(适配)

这个是适配器模式的主人公,但是也是最不好理解的,看上面那个图,那个适配器不是有多个口吗,有转换成USB的口,有转换成其他类型的口。在我的这个例子中,适配器就是那么多的口中,转换成USB的那个口,因为我的键盘是USB口,其他口我不需要。在示例代码中由PrintBanner类扮演这个角色。

//1.Target(对象)扮演者
public interface Print {
    public abstract void printWeak();

    public abstract void printStrong();

}

//2.Client(请求者)扮演者
public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("hello");
        p.printWeak();
        p.printStrong();
    }
}

//Adaptee(被适配)角色扮演者
public class Banner {
    private String string;

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

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

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

//Adapter(适配)扮演者
public class PrintBanner extends Banner implements Print {

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

    public void printWeak() {
        showWithParen();
    }

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

这里看Main方法中,他使用的是Print接口,也就是使用的是第一张图中的适配器设备。然后指向的是PrintBanner也就是那个USB接口为我提供服务。
这里用接口就有一个严重的问题了。我实现Print接口,我就要重写接口中的所有方法。但是现实生活中你也知道,我买了一个转换器,我可能就用其中一个转换口,其他口我都空着不用!
这时候就想到了,能不能把Print用抽象类代替。但是问题又出来了。如果用抽象类,我的PrintBanner不能即继承Banner又继承Print。这时我就只能通过"委托"的方式,即"交给其他人"去做。下面是对Print和PrintBanner的改造:(其实我这个新的Print写的不太好,因为,抽象类中的非抽象方法不用重写,其他必须重写,接口的方法必须重写,读者自己搞明白这里就行。)
public abstract class Print {
    public abstract void printWeak();

    public abstract void printStrong();
}
因为我新的这个Print中的方法给写成抽象的了,所以子类必须重写了。其实这里别写成抽象读者理解起来更合适。
public class PrintBanner extends Print {
    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    public void printWeak() {
        banner.showWithParen();
    }

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





发布了21 篇原创文章 · 获赞 17 · 访问量 8650
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章