适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
- 适用场景:当调用双方都不太容易修改的时候,为了复用现有组件可以使用适配器模式;在系统中接入第三方组 件的时候经常被使用到;
- 注意:如果系统中存在过多的适配器,会增加系统的复杂性,设计人员应考虑对系统进行重构;
由图可知适配器模式包含一下三个角色(以对象适配器为例):
1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于C#语言不支持多重继承,所以它只能是接口。
2:Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
3:Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
用户的目标接口:
public interface Target {
public void request();
}
被适配接口及其实现类:
public interface Apple {
public void process();
}
public class AppleImpl implements Apple {
@Override
public void process() {
System.out.println("我是苹果!!!");
}
}
Apple接口并不满足用接口规范,这时可以使用适配器模式:
public class TargetAdapter implements Target{
public Apple apple = new AppleImpl();
@Override
public void request() {
apple.process();
}
}
用户调用:
public class Test{
public static void main(String[] args){
TargetAdapter adapter = new TargetAdapter();
adapter.request();
}
}
桥接模式
它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
场景:对于某个接口A,可能有多个实现类。当用户希望通过接口A的实现类去完成某个功能时(功能方法并没有在接口A中定义),此时可以使用桥接模式。用户传入接口A的实现类,在调用目标抽象接口的方法来实现某些功能。
接口A及其实现类:
public interface Fruit {
void action();
}
public class Banana implements Fruit {
@Override
public void action() {
System.out.println("我要吃香蕉!!!");
}
}
public class Apple implements Fruit {
@Override
public void action() {
System.out.println("我要吃苹果!!!");
}
}
目标抽象接口:
public abstract class AbstractTarget {
public Fruit fruit = null;
public Fruit getFruit() {
return fruit;
}
public void setFruit(Fruit fruit) {
this.fruit = fruit;
}
abstract void operation();
}
目标接口的实现类:
public class AbstractTargetImpl extends AbstractTarget {
@Override
void operation() {
// 进行相应的业务处理
fruit.action();
}
}
用户调用:
public class Test {
public static void main(String[] args){
AbstractTarget at = new AbstractTargetImpl();
at.setFruit(new Apple());
at.operation();
}
}