㈠意图:设计模式
将抽象部分与它的实现部分相分离,使它们均可以独立地变化.ide
(二)动机:测试
当一个类须要在多个维度进行继承时,会出现多个维度的不一样的组合;从而致使子类数量的爆炸性增长;this
例如: 人从行业属性上进行扩展,能够分为Programmer, Actor, Accounter等子类;spa
若是再加上一个维度;男和女;就变成了以下状况:设计
设想一个极端状况;以下Person下有10个直接子类;而后再从性别属性进行区分就变成了要演变成10*2 = 20个子类; 更甚者;若是再从年龄层次这个属性进行区分(老,中,青)就会达到 10*2*3 = 60个子类;显然.当咱们对抽象部分进行独立地修改,扩充和重用时,都会对它下面的子类产生影响;对象
出现如此状况缘由的关键在于继承机制将抽象和具体的实例化进行了强绑定(继承);解决此问题的方法就是脱耦(其实许多设计模式的关键就是在于用不一样的方式,从不一样地维度进行解耦).继承
在Bridge模式中;解耦的方法就是将不一样维度之间的强关联关系(继承)改为弱关联关系.将它们的之间的继承关系改为聚合关系;所它们能够在不一样维度相对独立地变化)接口
(三) UML图:get
能够看出,这个系统含有两个等级结构,也就是:
桥梁模式所涉及的角色包括:
聚合关系就像一个桥梁;把不一样的维度关联起来.
㈣ 场景对应:
Person:抽象化角色;
按所属行业这一维度进行继承: 修改抽象化角色
按性别这一维度进行扩展:实现化角色
Male, Female:具体实现化角色;
㈤ 代码对应:
- /**
- * Bridge模式中的Implement角色(另外一维度的抽象表示)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public abstract class Gender
- {
- protected abstract void operator();
- }
- /**
- * Bridge模式中的ConcreteImplement角色(另外一维度的抽象表示实现)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Female extends Gender
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Gender#operator()
- */
- @Override
- protected void operator()
- {
- System.out.println("female");
- }
- }
- /**
- * Bridge模式中的ConcreteImplement角色(另外一维度的抽象表示实现)
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Male extends Gender
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Gender#operator()
- */
- @Override
- protected void operator()
- {
- System.out.println(" male execute");
- }
- }
- /**
- * Bridge模式中的抽象角色
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public abstract class Person
- {
- private Gender gender;
- /**
- * @return the gender
- */
- public Gender getGender()
- {
- return gender;
- }
- /**
- * @param gender the gender to set
- */
- public void setGender(Gender gender)
- {
- this.gender = gender;
- }
- /**
- *
- */
- public void operator()
- {
- this.gender.operator();
- }
- }
- /**
- * Bridge角色中的 Redefined
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Programmer extends Person
- {
- /* (non-Javadoc)
- * @see com.skywares.designpattern.bridge.Person#operator()
- */
- @Override
- public void operator()
- {
- this.getGender().operator();
- System.out.println("programer");
- }
- }
- /**
- * 测试类
- */
- package com.skywares.designpattern.bridge;
- /**
- * @author Administrator
- *
- */
- public class Client
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- Person person = new Programmer();
- // 调用第一个;
- person.setGender(new Male());
- person.operator();
- // 改变另外一个属性;
- person.setGender(new Female());
- person.operator();
- }
- }