您的位置:首页 > 其它

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

2012-07-01 00:03 531 查看
㈠意图:

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

GOF 设计模式;

(二)动机:

当一个类需要在多个维度进行继承时,会出现多个维度的不同的组合;从而导致子类数量的爆炸性增加;

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



如果再加上一个维度;男和女;就变成了如下情况:



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

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

在Bridge模式中;解耦的方法就是将不同维度之间的强关联关系(继承)改成弱关联关系.将它们的之间的继承关系改成聚合关系;所它们可以在不同维度相对独立地变化)

(三) UML图:



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

由抽象化角色和修正抽象化角色组成的抽象化等级结构。(一个维度)

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

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

抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。

修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。

实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。

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

㈣ 场景对应:

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();

}

}


本文出自 “hubert_guo” 博客,请务必保留此出处http://hubertguo.blog.51cto.com/2358769/914476
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: