zoukankan      html  css  js  c++  java
  • 设计模式之桥接模式

    以下内容均参考:https://www.cnblogs.com/lixiuyu/p/5923160.html

    桥接模式(Bridge)是一种结构性设计模式。Bridge模式基于类的最小原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与实现(Implementation)分离开来,从而可以保持各部分的独立性以及对他们的功能扩展。

    理解:将行为和抽象类分开,通过抽象类和抽象类的子类来对行为接口进行实例化。当有其他的行为加入进来时,只需要将行为接口和实现类写好,在抽象类中生成set和get方法,以及需要调用的方法即可。在抽象类的子类中将相关需要调用的方法写好即可。通过这样的方式来分开接口和抽象类降低耦合度。

    桥接模式的角色和职责:

    1.Client调用端

    这是Bridge模式的调用者

    2.抽象类(Abstraction)

    抽象类接口(接口的抽象类)维护对行为实现(Implementation)的引用。它的角色就是桥接类。

    3.Refined Abstraction

    这是Abstraction的子类

    4.Implementor

    行为实现类接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)

    5.ConcreteImplementor

    Implementor的子类

    桥接模式的UML图如下:

     

    实例代码如下:

    首先定义Implementor接口,其中定义了其实现类必须要实现的接口operation()

    /*行为接口*/
    public interface Implementor{
       public void operation();  
    }
    下面定义Implementor的实现类:
    public class ConcreteImplementorA{
         public void opertion(){
             System.out.println("this is concreteImplementorA operator...");  
        }          
    }   
    public class ConcreteImplementorB{
         public void opertion(){
             System.out.println("this is concreteImplementorB operator...");  
        }          
    }   

    定义桥接类Abstraction类,其中有对Implementor的引用:

    public class Abstraction{
           private Implementor implementor=new Implementor();
           public Implementor getImplementor(){
                  return implementor;
           } 
           public void setImplementor(){
                  this.implementor=implementor;
           }
           public void operation(){
               implementor.operation();
           }
    }    

    下面是Abstraction类的子类RefineAbstraction:

    public class RefineAbstraction extends Abstraction{
              public void operator(){
                 super.getImplementor.operation();
              }
    }
    下面是测试类:
    public class BridgeTest {
        public static void main(String[] args) {
            Abstraction  abstraction=new RefinedAbstraction();
            abstraction.setImplementor(new ConcreteImplementor());
            abstraction.operation();
            
            abstraction.setImplementor(new ConcreteImplementorB());
            abstraction.operation();
            
        }
    }

    运行结果如下:

    这样,通过对Abstaction桥接类的调用,实现了对接口Implementor的实现类ConcreteImplementorA和ConcreteImplementorB的调用。实现了抽象与行为实现的分离。

    总结:

    1.桥接模式的优点

       (1)实现了抽象和实现部分的分离

        桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

        (2)更好的扩展性

         由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会互相影响,大大的提供了系统的扩展性。

        (3)可动态的切换实现

         由于桥接模式实现了抽象和实现的分离,所以实现桥接模式时,就可以实现动态的选择和具体的实现。

         (4)实现细节对客户端透明,可以对用户隐藏实现细节。

    2.桥接模式的缺点

         (1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

         (2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

    3.桥接模式的使用场景

       (1)如果一个系统需要在构件的抽象化角色之间增加更多的灵活性,避免在两个层次之间建立动态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

       (2)抽象化角色和实现化角色可以通过继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

       (3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

       (4)虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

       (5)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

  • 相关阅读:
    动态规划(DP),模拟
    递推,动态规划(DP),字符串处理,最佳加法表达式
    递归,动态规划,找最短路径,Help Jimmy
    动规,模拟,递推,最长公共子序列
    递归,递推,记忆化搜索,空间优化(数字三角形)
    递归,记忆化搜索,(棋盘分割)
    递归,搜索,回溯,最优路径(线段)
    web前端开发初学者必看的学习路线(附思维导图)
    一位资深程序员大牛给予Java初学者的学习路线建议
    假如时光倒流,我会这么学习Java
  • 原文地址:https://www.cnblogs.com/kongnengjing/p/8605591.html
Copyright © 2011-2022 走看看