Java设计模式(三)Adapter(适配器),Bridge(桥接)

来源:互联网 发布:简单音频剪辑软件 编辑:程序博客网 时间:2024/06/10 11:43

 结构模式(-)


Adapter(适配器)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

 

Adapter分为2种:

类适配器和对象适配器。Adapter和Adaptee之间是is-a关系的时候,属于类适配器,Adapter和Adaptee之间是has-a关系的时候,属于对象适配器。

 

基于“当涉及到依存性时,应当始终优先选择组合/成员关系而不是继承”的设计原则,并且由于多继承在使用上的复杂性,及在部分情况下不可行等原因,对象适配器优先于类适配器

 

使用场景

1 你想使用一个已经存在的类,但他的接口不符合你的需求。
2 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。


 

主要参与者

Target:决定要用什么方法

public interface Target {
   public void request();
}

 

Adaptee:提交最初的方法

public class Adaptee {
   public void requestSpecial(){
       //处理一些额外的请求
   }
}

 

Adapter:用Adaptee去实现Target的方法

public class Adapter extends Adaptee implements Target{

@Override
  // 这里用的是类Adapter模式,采用了多重继承
  public void request() {
  // TODO Auto-generated method stub
  super.requestSpecial();
  }

}

 

Client:使用Target的方法

public class Client {

  public static void main(String[] args) {
   Target t = new Adapter();

    t .request();
  }

}

以上是类适配器,下面是对象适配器

对象适配器与类适配器的区别在于如何实现Target所需要的方法,类适配器是继承而对象适配器是委托

Adapter:用Adaptee去实现Target的方法

public class Adapter implements Target{

    private Adaptee adaptee;

    public Adapte(Adaptee adaptee){

        this.adaptee =  adaptee;

    }

   @Override
  // 这里用的是类Adapter模式,采用了多重继承
  public void request() {
  /    / TODO Auto-generated method stub
       adaptee.requestSpecial();
  }

}

 

适配器是为了把一个类的接口转换成客户希望的另外一个接口,按照这个接口指定的方法去完成实现

 

Bridge(桥接)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。 解耦合

 

使用场景

1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

 

主要参与者

Abstraction 功能抽象

public class Abstraction{

    private Implementor impl;

    public Abstraction(Implementor impl){

        this.impl = impl;

    }

    public void operation(){

        imp. operationImp();

    }

}

 

RefinedAbstraction 更多的功能抽象

public class RefinedAbstraction {

    private Implementor impl;

    public RefinedAbstraction (Implementor impl){

        super(impl);

    }

    public void otherOperation(){

        //using operation();

    }

}

 

Implementor 实现

public interface Implementor{

    public abstact void operationImp();

}

 

ImplementorA  具体实现

public  class ImplementorA implement Implementor{

  public void operationImp(){

  //Implement it

  }

}

 

Client

public class Client {

  public static void main(String[] args) {

   Implementor impl = new ImplementorA ();

    Abstraction abstaction = new RefinedAbstraction (impl );

    abstaction.operation();

    abstaction.otherOperation();
  }

}

 

效果及实现要点
  1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
  2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。
  3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
  4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

 

Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则