适配器模式

来源:互联网 发布:淘宝现在好做吗 编辑:程序博客网 时间:2024/06/06 05:10

装饰者模式:把对象包装起来,赋予新的职责

适配器模式:将对象包装起来,以简化其接口-----将类的接口转换成想要的接口,以便实现不同的接口

外观模式:让接口更简单

1. 例子

[1]  标准的交流电插头                              交流电适配器                             欧洲壁式插座

       笔记本电脑接口                                           转换                                   得到电力接口

         不需要改变代码                                       新代码                                 不需要改变代码

        客户依据目标接口实现          目标接口,持有被适配者实例            被适配者接口    

       1)客户通过目标接口调用适配器的方法,对象适配器发出请求

       2)适配器使用被适配者接口把请求转化成被适配者的一个或多个调用接口

      3)客户接收到调用的结果,并未察觉这一切都是在适配器在转化作用

[2]  缺鸭子对象,用火鸡对象来冒充


  Duck是目标接口                              TurkeyAdapter是适配器                     Turkey是被适配者

        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
 

A   实现一个适配器所需要进行的工作,和目标接口的大小成正比

B   提供一个适配器类,将所有的改变封装在一个类中

C   一个适配器,只能将一个接口转换成另一个

D   双向适配器,可以支持两边的接口。满足新旧厂商的接口

------------------------------------------------------------------------------------------------------------------------------------------------------------

良好的OO原则:使用对象组合,已修改的接口包装被适配者

上面是对象适配器

下面是类适配器(Java中不能多重继承)


------------------------------------------------------------------------------------------------------------------------------------------------------------

3.  家庭影院,内含DVD播放器、投影机、自动屏幕、环绕立体声、爆米花机

【】想看电影,必须先执行一些任务,【】看完电影,还要关掉一切,【】升级系统,要重新学习一套不同的操作过程

     1)给家庭影院创建一个外观,对外暴露几个简单的方法;

     2)这个外观将家庭影院的诸多组件视为一个子系统,通过这个子系统,调用方法

     3)客户只要用方法即可

public class HomeTheaterFacade {
    Amplifier amp;
    Tuner tuner;
    DvdPlayer dvd;
    CdPlay cd;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;
    
    public HomeTheaterFacade(Amplifier amp,
            Tuner tuner,
            DvdPlayer dvd,
            CdPlay cd,
            Projector projector,
            TheaterLights lights,
            Screen screen,
            PopcornPopper popper){
        this.amp =amp;
        this.tuner = tuner;
        this.dvd = dvd;
        this.cd = cd;
        this.projector = projector;
        this.lights = lights;
        this.screen = screen;
        this.popper = popper;
    }
    
    public void watchMovie(String movie){
        popper.on();
        popper.pop();
        lights.dim(10);
        lights.down();
        projector.on();
        projector.wideScrrenMode();
        amp.on();
        amp.setDvd(dvd);
        amp.setSurroundSound();
        amp.setVolume(5);
        dvd.on();
        dvd.play(movie);
    }
    
    public void endMovie(){
        ......
    }
}

外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

最少知识原则:只和你的密友谈话


【1】外观没有封装子系统的类,只提供简化的接口,可以直接使用子系统的类,将系统完整功能暴露出来,以供需要的人使用

【2】外观附加“聪明”的功能,知道先开机才能看电影

【3】每个子系统可以有多个外观

【4】外观不只是简化了接口,也将客户从组件的子系统中解耦(升级系统,不用改客户代码,只要修改外观代码)

【5】外观可以包装很多类,意图是简化接口