设计模式学习(六) ------- 适配器与外观

来源:互联网 发布:淘宝hd ios历史版本 编辑:程序博客网 时间:2024/04/30 03:01

适配器模式:

         经常碰到当你需要使用某个类时, 发现它的接口不符合你的要求,比如你要一只鸭子,但是手上只有火鸡,那怎么办?

         你可以说写个新的Duck class , 但是现实是不能创建新的类的,所以我们需要想个办法使火鸡来代替鸭子

   how??

         适配器help us , 它使Turky能够作用

         首先我们写个    

  public class TurkyDuck implements Duck{

          private Turky turky;

          public void setTurky(Turky turky){

                   this.turky = turky;

           }

           @Override

           public void qurk(){

                    turky.bell();

            }

           public void dkfj(){

                    turky.eirio();

           }

}

 You now see the Point , did you?

            we can use the TurkyDuck class to fit the need by use the method of the Turky

通过实现Target接口,调用被适配的接口的方法,来实现Target接口的方法,偷天换日!!!

         这里Target是Duck

               被适配的是Turky

这种适配方式也被称作对象适配器

还有一种适配方式是,类适配器,需要多重继承,即继承Duck和Turky(Java中不行)

当然这两种适配方式,各有优缺

对象适配器: 首先它是组合方式加入了被适配的对象,因此灵活性配高,还可以适配被适配对象的子类

                    当然弹性更好

类适配:     他不需要实现Target接口的每个方法,只需要一个适配器类(对象适配需要两个:适配器类和被适配类)

 

总之,适配器将客户与接口的实现解耦,客户并不了解适配的过程,并不知道其实是被适配类在工作,同时适配器可以包含多个被适配的类一起工作。

适配器与装饰的区别:

        适配器是间接的改变被适配接口的类型,使其看上去符合Target接口而被调用工作——仅仅是重写(用被适配类的方法,实现Target接口)

        装饰是对Target进行包装而使其增加功能——(这是扩展)

 

外观模式:

        有时候为了实现某个任务,我们需要调用多个对象的多个方法,十分的繁琐,比如你想使用家庭影院看电影,你要打开电源,打开DVD,放入片子,调好声音 等等

        是想你每次要看就要重复上面的动作,如果上面涉及了10个对象,20个方法,要写100行,难道每次都去写吗,肯定不是的,肯定是不合理的

        其实,现实中coding肯定已经用到了外观模式,就是简化

        碰到上面的问题,我们一般会写个方法,将所有的操作封装起来,下次只要调用这个方法就可以了,这就是外观的一种应用(我觉得)

        当然更正式 的外观模式,是指你写个单独的类Theater,写个单独的方法封装上面的一系列操作,当然对于家庭影院的其他操作写可以写方法封装起来

      总之,客户只要一个Theater的对象,就可以了,而不需要与什么10个小对象耦合

      这里我们可以看到OO设计原则的影子

OO原则——最少朋友(Least Friend)

      可以解释为: 每个类尽量少的与其他类耦合在一起

一般来说,对于对象的使用有这么几个条件:

       方法中可以使用传进来的对象

       使用方法中new 的对象

       使用类的实例变量

       对象本身

 

其他的对象最好不要用(如System.out.println(""));

你可以看到这里就耦合了PrintOutStream 当然为了方便可以这么做,

但是不提倡,因为这样增加了维护的困难

 

总结一下:

      装饰——扩展

      适配——改变接口

      外观——简化

这是三种相似模式的目的

 

 

原创粉丝点击