适配器模式与桥接模式代码写法有些相似,所以我想把它们记录到一块。
适配器模式
适配器模式顾名思义目的就是为了去适应目标接口而产生的一种模式。举个例子,一台电脑如果只有USB接口的话就无法插上网线,而要插上网线的话就必须使用一个转接头,那么这个转接头就充当了一个适配器,连接了网线和电脑,适配器模式就是这样,就是将一个类的接口转化成客户希望的另外一个接口,让他写原本接口不兼容而不能在一起工作的类能够一起工作。
流程图
以刚刚提到的电脑插网线为例
代码示例
首先创建一个接口抽象实现接口转换器
package Demo2;
//接口转换器的抽象实现
public interface NetToUsb {
//作用:处理请求
public void handleRequest();
}
创建一个要被适配的类
package Demo2;
public class Adaptee {
public void reuqest(){
System.out.println(“可以上网”);
}
}
创建一个适配器(用组合的方式)
package Demo2;
public class Adapter2 implements NetToUsb{
private Adaptee adaptee;
public Adapter2(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public void handleRequest() {
// TODO Auto-generated method stub
adaptee.reuqest();
}
}
创建一个电脑类并测试结果
package Demo2;
//客户端类,想上网却插不上网线
public class Computer {
public void net(NetToUsb Adapter)
{
//上网的具体实现,需要转接头
Adapter.handleRequest();
}
public static void main(String[] args) {
Computer computer=new Computer();
Adaptee adaptee=new Adaptee();
Adapter2 adapter=new Adapter2(adaptee);
computer.net(adapter);
}
}
对象适配器的优点:
一个对象适配器可以把多个不同的适配者适配到同一个目标;
可以适配一个适配者的子类
类适配器缺点:
对于C#,java等语言,一次只能最多适配一个适配者类
对于C#,java等语言,类适配器模式中的目标抽象类只能为接口而不能为类,有一定的局限性。
适用场景
系统需要使用现有的类,而这些类的接口不符合系统需要
想创建一个可以重复使用的类,用于与彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
========================================================
桥接模式
桥接模式,是为了将一个类的抽象部分与实现部分进行分离,使他们都可以独立的变化,是一种对象性结构模式。就好比品牌与产品的关系,台式机有许多产品,笔记本也有许多产品,要把他们关联起来,这就需要通过一个连接点将他们关联起来,这就是桥接模式做的事情
流程图
代码示例
我们先去创建一个品牌接口
package Bridge;
public interface Brand {
void info();
}
然后分别创建品牌类调用这个品牌接口
package Bridge;
public class Apple implements Brand{
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println(“Apple”);
}
}
======================================================
package Bridge;
public class Lenovo implements Brand{
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println(“Lenovo”);
}
}
然后我们去创建一个抽象的电脑类,用组合的方式去调用品牌,然后创建不同的产品类型类继承电脑类
package Bridge;
//抽象的电脑类
public class Computer {
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info(){
brand.info();
}
}
class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
// TODO Auto-generated constructor stub
}
public void info(){
super.info();
System.out.println("台式机");
}
}
class Laptop extends Computer{
public Laptop(Brand brand) {
super(brand);
// TODO Auto-generated constructor stub
}
public void info(){
super.info();
System.out.println("笔记本");
}
}
创建一个Test用例测试
package Bridge;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer=new Laptop(new Apple());
computer.info();
Computer computer2=new Desktop(new Lenovo());
computer2.info();
}
}
优缺点:
优点:
桥接模式偶尔类似于多继承方案,但桥接模式是比多继承方案更好的解决办法,因为多继承方案违背了“单一职责原则”,复用性较差。
桥接模式提高了系统的可扩展性。
缺点:
桥接模式的引入会增加系统的理解与设计难度。
桥接模式要求要正确识别出系统中两个独立变化的维度,因此其适用范围有一定的局限性。
场景
java语言通过java虚拟机实现了平台的无关性
AWT中的Peer架构
JDBC驱动程序