设计模式(二十三)—桥梁模式
最后更新于:2022-04-01 16:26:41
**定义**:将抽象和实现解耦,使得两者之间可以独立的变化。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340d6b018.jpg)
Abstract抽象化角色
---|主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用。该角色一般是抽象类
Implementor实现化角色
---|他是接口或者抽象类,定义角色必须的行为和属性
RefinedAbstraction修正抽象化角色
---|它引用实现化角色对抽象化角色进行修正
ConcreteImplementor具体实现化角色
---|它实现接口或抽象类定义的方法和属性
------抽象角色引用实现角色,或者说抽象角色的部分实现是引用实现角色来完成的。
桥梁模式使用了类间的聚合关系、继承、覆写等常用功能
~~~
public class BridgeTest {
public static void main(String[] args) {
//定义一个实现化角色
Implementor imp = new ConcreteImplementor1();
//定义一个抽象化角色
Abstract abs = new RefinedAbstraction(imp);
abs.request();
}
}
/**
* 实现化角色
* 定义要实现的方法
* @author admin
*
*/
interface Implementor{
//基本方法
public void doSomething();
public void doAnything();
}
/**
* 具体实现化角色
* @author admin
*/
class ConcreteImplementor1 implements Implementor{
@Override
public void doSomething() {
System.out.println("具体实现化1,doSomething");
}
@Override
public void doAnything() {
System.out.println("具体实现化1,doAnything");
}
}
/**
* 具体实现化角色
* @author admin
*/
class ConcreteImplementor2 implements Implementor{
@Override
public void doSomething() {
System.out.println("具体实现化2,doSomething");
}
@Override
public void doAnything() {
System.out.println("具体实现化2,doAnything");
}
}
/**
* 抽象角色,定义该角色的行为,保存一个实现化角色的引用
* @author admin
*
*/
abstract class Abstract{
//定义对实现化角色的引用
private Implementor imp;
//约束子类必须去实现该构造函数
public Abstract(Implementor imp){
this.imp = imp;
}
//自身的行为和属性
public void request(){
this.imp.doSomething();
}
//得到实现化角色
public Implementor getImp(){
return this.imp;
}
}
/**
* 具体抽象化角色
* @author admin
*
*/
class RefinedAbstraction extends Abstract{
//覆写构造函数
public RefinedAbstraction(Implementor imp) {
super(imp);
}
//修正父类的行为
@Override
public void request() {
super.request();
super.getImp().doAnything();
}
}
~~~
## 一个例子:
一个商人,开了两家公司,一家专门做正规的产品,另一家做能挣钱的(不管正不正规)产品。
因此,当市场上那些可以盈利,他都会立马转型去做这个东西。但是公司内部人员不会改变。
如何解决公司在不用改变内部结构的前提下,实现公司的转型呢?这就需要一个桥梁来连接。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340d87c3a.jpg)
~~~
public class BridgeT {
public static void main(String[] args) {
//创建产品对象
House house = new House();
//创建出公司对象
Corp houseCorp = new HouseCorp(house);
houseCorp.makeMoney();
}
}
/**
* 抽象的公司类,
* 定义每个子公司需要实现的方法。
* 同时保存对实现化类的引用
* @author admin
*/
abstract class Corp{
private Product product;
//对实现化类的引用
public Corp(Product product) {
this.product = product;
}
//公司主要的目的是赚钱
public void makeMoney(){
//现生产商品
this.product.beProducted();
//再做销售
this.product.beSell();
}
}
/**
* 具体的公司实现类,实现对实现化类的引用
* @author admin
*
*/
class HouseCorp extends Corp{
public HouseCorp(Product product) {
super(product);
}
@Override
public void makeMoney() {
//不该变公司的策略
super.makeMoney();
System.out.println("房地产公司赚大钱了。。。");
}
}
/**
* 抽象类,具体子公司要实现的方法
* @author admin
*
*/
abstract class Product{
//产品销售
public abstract void beSell();
//产品生产
public abstract void beProducted();
}
/**
* 具体的产品实现类
* @author admin
*/
class House extends Product{
@Override
public void beSell() {
System.out.println("房子是这样卖出去的...");
}
@Override
public void beProducted() {
System.out.println("房子是这样生产的...");
}
}
~~~
**桥梁模式的优点:**
---|抽象和实现分离
---|优秀的扩充能力
---|实现细节对客户透明。
**桥梁模式的使用场景**
---|不希望或不适用使用继承的场景
---|接口或抽象类不稳定的场景
---|重用性要求较高的场景