Design Pattern学习笔记 --- Bridge(桥接)模式

㈠意图:设计模式

将抽象部分与它的实现部分相分离,使它们均可以独立地变化.ide

  • GOF 设计模式;

(二)动机:测试

当一个类须要在多个维度进行继承时,会出现多个维度的不一样的组合;从而致使子类数量的爆炸性增长;this

例如: 人从行业属性上进行扩展,能够分为Programmer, Actor, Accounter等子类;spa

  

若是再加上一个维度;男和女;就变成了以下状况:设计

    设想一个极端状况;以下Person下有10个直接子类;而后再从性别属性进行区分就变成了要演变成10*2 = 20个子类; 更甚者;若是再从年龄层次这个属性进行区分(老,中,青)就会达到 10*2*3 = 60个子类;显然.当咱们对抽象部分进行独立地修改,扩充和重用时,都会对它下面的子类产生影响;对象

    出现如此状况缘由的关键在于继承机制将抽象和具体的实例化进行了强绑定(继承);解决此问题的方法就是脱耦(其实许多设计模式的关键就是在于用不一样的方式,从不一样地维度进行解耦).继承

    在Bridge模式中;解耦的方法就是将不一样维度之间的强关联关系(继承)改为弱关联关系.将它们的之间的继承关系改为聚合关系;所它们能够在不一样维度相对独立地变化)接口

(三) UML图:get

能够看出,这个系统含有两个等级结构,也就是:

  • 由抽象化角色和修正抽象化角色组成的抽象化等级结构。(一个维度)
  • 由实现化角色和两个具体实现化角色所组成的实现化等级结构。(另外一个维度)

桥梁模式所涉及的角色包括:

  • 抽象化(Abstraction)角色抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象化(Refined Abstraction)角色扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不必定和抽象化角色的接口定义相同,实际上,这两个接口能够很是不同。实现化角色应当只给出底层操做,而抽象化角色应当只给出基于底层操做的更高一层的操做。
  • 具体实现化(Concrete Implementor)角色这个角色给出实现化角色接口的具体实现。

聚合关系就像一个桥梁;把不一样的维度关联起来.

㈣ 场景对应:

    Person:抽象化角色;

    按所属行业这一维度进行继承: 修改抽象化角色

    按性别这一维度进行扩展:实现化角色

    Male, Female:具体实现化角色;

㈤  代码对应:

 

  
  
  
  
  1. /** 
  2.  *  Bridge模式中的Implement角色(另外一维度的抽象表示) 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public abstract class Gender 
  11.     protected abstract void operator(); 

 

  
  
  
  
  1. /** 
  2.  * Bridge模式中的ConcreteImplement角色(另外一维度的抽象表示实现) 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Female extends Gender 
  11.  
  12.     /* (non-Javadoc) 
  13.      * @see com.skywares.designpattern.bridge.Gender#operator() 
  14.      */ 
  15.     @Override 
  16.     protected void operator() 
  17.     { 
  18.         System.out.println("female"); 
  19.     } 
  20.  

 

  
  
  
  
  1. /** 
  2.  * Bridge模式中的ConcreteImplement角色(另外一维度的抽象表示实现) 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Male extends Gender 
  11.  
  12.     /* (non-Javadoc) 
  13.      * @see com.skywares.designpattern.bridge.Gender#operator() 
  14.      */ 
  15.     @Override 
  16.     protected void operator() 
  17.     { 
  18.         System.out.println(" male execute"); 
  19.     } 
  20.  

 

  
  
  
  
  1. /** 
  2.  * Bridge模式中的抽象角色 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public abstract class Person 
  11.     private Gender gender; 
  12.  
  13.     /** 
  14.      * @return the gender 
  15.      */ 
  16.     public Gender getGender() 
  17.     { 
  18.         return gender; 
  19.     } 
  20.  
  21.     /** 
  22.      * @param gender the gender to set 
  23.      */ 
  24.     public void setGender(Gender gender) 
  25.     { 
  26.         this.gender = gender; 
  27.     } 
  28.      
  29.     /** 
  30.      *  
  31.      */ 
  32.     public void operator() 
  33.     { 
  34.         this.gender.operator(); 
  35.     } 

 

  
  
  
  
  1. /** 
  2.  * Bridge角色中的 Redefined 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6.  
  7. /** 
  8.  * @author Administrator 
  9.  * 
  10.  */ 
  11. public class Programmer extends Person 
  12.     /* (non-Javadoc) 
  13.      * @see com.skywares.designpattern.bridge.Person#operator() 
  14.      */ 
  15.     @Override 
  16.     public void operator() 
  17.     { 
  18.         this.getGender().operator(); 
  19.         System.out.println("programer"); 
  20.     } 
  21.  

 

  
  
  
  
  1. /** 
  2.  * 测试类 
  3.  */ 
  4. package com.skywares.designpattern.bridge; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Client 
  11.  
  12.     /** 
  13.      * @param args 
  14.      */ 
  15.     public static void main(String[] args) 
  16.     { 
  17.         Person person = new Programmer(); 
  18.          
  19.         // 调用第一个; 
  20.         person.setGender(new Male()); 
  21.         person.operator(); 
  22.          
  23.         // 改变另外一个属性; 
  24.         person.setGender(new Female()); 
  25.         person.operator(); 
  26.          
  27.          
  28.     } 
  29.  
相关文章
相关标签/搜索