适配器模式(Adater Pattern)
适配器模式又叫变压模式,也叫做包装模式,但包装模式不止一个,装饰者模式也是包装者模式的一种:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
实现的核心思想:通过类的继承或者关联。
因此可以分成两类:
1. 类适配器:通过类间的继承实现。
[img]http://dl.iteye.com/upload/attachment/0065/4780/c077c0ea-981e-3896-be7c-15b047985908.png[/img]
2. 对象适配器:通过类间的关联实现。
[img]http://dl.iteye.com/upload/attachment/0065/4782/f17a65dd-520d-3023-b8ab-081b6d36073f.png[/img]
优点:
1. 使两个没有任何关系的类在一起运行。
2. 增加类的透明性,高层模块只需要调用Target目标角色,对于具体的业务实现不需要关心,交给源角色Adapee处理。对高层模块来说是透明的。
3. 提高类的复用度,源角色在原有系统中可以正常使用,在目标系统中又可以充当新的演员。
4. 灵活性好,加载和卸载简单。对于其它代码基本不需要修改。
使用场景:在一个已投产的项目中,需要使用一个已有的类或者新建的类,而这个类又不适合系统原有的接口,可以考虑使用适配者模式。
使用的注意事项:在详细设计中一般不会考虑使用适配者模式,而是在对系统的扩展上,同时要保证遵守依赖倒置和里氏替换原则。
代码:
类适配器:
对象适配器:
前面的Target,ConcreteTarget一样在此不重复。
适配器模式又叫变压模式,也叫做包装模式,但包装模式不止一个,装饰者模式也是包装者模式的一种:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
实现的核心思想:通过类的继承或者关联。
因此可以分成两类:
1. 类适配器:通过类间的继承实现。
[img]http://dl.iteye.com/upload/attachment/0065/4780/c077c0ea-981e-3896-be7c-15b047985908.png[/img]
2. 对象适配器:通过类间的关联实现。
[img]http://dl.iteye.com/upload/attachment/0065/4782/f17a65dd-520d-3023-b8ab-081b6d36073f.png[/img]
优点:
1. 使两个没有任何关系的类在一起运行。
2. 增加类的透明性,高层模块只需要调用Target目标角色,对于具体的业务实现不需要关心,交给源角色Adapee处理。对高层模块来说是透明的。
3. 提高类的复用度,源角色在原有系统中可以正常使用,在目标系统中又可以充当新的演员。
4. 灵活性好,加载和卸载简单。对于其它代码基本不需要修改。
使用场景:在一个已投产的项目中,需要使用一个已有的类或者新建的类,而这个类又不适合系统原有的接口,可以考虑使用适配者模式。
使用的注意事项:在详细设计中一般不会考虑使用适配者模式,而是在对系统的扩展上,同时要保证遵守依赖倒置和里氏替换原则。
代码:
类适配器:
package org.AdaterPattern.extend;
public interface Target {
public void request();
}
package org.AdaterPattern.extend;
public class ConcreteTarget implements Target {
public void request() {
System.out.println("this is ConcreteTarget");
}
}
package org.AdaterPattern.extend;
public class Adapee {
public void dosoming(){
System.out.println("this is Adapee");
}
}
package org.AdaterPattern.extend;
public class Adater extends Adapee implements Target {
public void request() {
super.dosoming();
}
}
package org.AdaterPattern.extend;
public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater();
target.request();
}
}
对象适配器:
前面的Target,ConcreteTarget一样在此不重复。
package org.AdaterPattern.relation;
public interface IAdapee1 {
public abstract void dosoming();
}
package org.AdaterPattern.relation;
public interface IAdapee2 {
public void dosoming();
}
package org.AdaterPattern.relation;
public class Adapee1 implements IAdapee1 {
public void dosoming(){
System.out.println("this is Adapee1");
}
}
package org.AdaterPattern.relation;
public class Adapee2 implements IAdapee2{
public void dosoming(){
System.out.println("this is Adapee2");
}
}
package org.AdaterPattern.relation;
public class Adater implements Target {
private IAdapee1 iAdapee1;
private IAdapee2 iAdapee2;
private Adapee1 adapee1;
private Adapee2 adapee2;
public Adater(Adapee1 adapee1, Adapee2 adapee2) {
this.adapee1 = adapee1;
this.adapee2 = adapee2;
this.iAdapee1 = this.adapee1;
this.iAdapee2 = this.adapee2;
}
public void request() {
this.iAdapee1.dosoming();
this.iAdapee2.dosoming();
}
}
package org.AdaterPattern.relation;
public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater(new Adapee1(),new Adapee2());
target.request();
}
}