设计模式学习(六) ------- 适配器与外观
2009-07-18 16:08
232 查看
适配器模式:
经常碰到当你需要使用某个类时, 发现它的接口不符合你的要求,比如你要一只鸭子,但是手上只有火鸡,那怎么办?
你可以说写个新的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 当然为了方便可以这么做,
但是不提倡,因为这样增加了维护的困难
总结一下:
装饰——扩展
适配——改变接口
外观——简化
这是三种相似模式的目的
经常碰到当你需要使用某个类时, 发现它的接口不符合你的要求,比如你要一只鸭子,但是手上只有火鸡,那怎么办?
你可以说写个新的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 当然为了方便可以这么做,
但是不提倡,因为这样增加了维护的困难
总结一下:
装饰——扩展
适配——改变接口
外观——简化
这是三种相似模式的目的
相关文章推荐
- 设计模式学习之适配器与外观模式
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- 设计模式学习笔记之-适配器和装饰器的区别
- 设计模式学习--------4.外观模式学习
- 设计模式学习笔记(十一)——Facade外观
- 设计模式学习(九)外观模式-享元模式-代理模式
- C#设计模式学习小结之六 外观模式
- 设计模式学习: Adapter(适配器, Wrapper)模式
- 设计模式学习--外观模式
- 【设计模式学习笔记十一】【结构型模式】【外观模式(Facade)】
- HeadFirst 设计模式学习笔记7--适配器模式和外观模式
- 设计模式学习(八):外观模式
- java/android 设计模式学习笔记(14)---外观模式
- 设计模式: 自己手动写一适配器和外观模式
- 设计模式学习笔记(十一)——Facade外观模式
- 设计模式学习笔记--Façade外观模式
- 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)
- 学习设计模式笔记--外观模式
- “设计模式”学习之五:桥接、外观、享元与代理(结构型)