GoF23种设计模式之结构型模式之桥接模式
2017-09-03 22:50
531 查看
一、概述
将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。
二、适用性
1.你不希望在抽象和实现之间有一个固定的绑定关系的时候。例如:在程序运行时实现部分应可以被选择或切换。
2.类的抽象以及实现都应该可以通过生成子类的方法加以扩充的时候。桥接模式使你可以对不同的抽象接口和实现进行组合,并且分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响的时候,即客户的代码不必重新编译。
4.你必须将一个对象分解成两个部分的时候。
5.你想在多个对象间共享实现(可能使用引用计数),但是同时要求客户并不知情的时候。
三、参与者
1.Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction:扩充由Abstraction定义的接口。
3.Implementor:定义实现类的接口。该接口不一定要与Abstraction接口完全一致。事实上可以完全不同。一般而言,Implementor接口提供基本操作,而Abstraction接口提供较高层次操作。
4.ConcreteImplementor:实现Implementor接口,并且定义它的具体实现。
四、类图
五、示例
Abstraction
[java] view plain copy
print?
package cn.lynn.bridge;
public abstract class Player {
private Equipment equipment;
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Equipment getEquipment() {
return equipment;
}
protected abstract void buyEquipment();
}
RefinedAbstraction
[java] view plain copy
print?
package cn.lynn.bridge;
public class MalePlayer extends Player {
public MalePlayer() {
super.setGender("男性玩家");
}
@Override
public void buyEquipment() {
super.getEquipment().playerBuyEquipment(this);
}
}
[java] view plain copy
print?
package cn.lynn.bridge;
public class FemalePlayer extends Player {
public FemalePlayer() {
super.setGender("女性玩家");
}
@Override
public void buyEquipment() {
super.getEquipment().playerBuyEquipment(this);
}
}
Implementor
[java] view plain copy
print?
package cn.lynn.bridge;
public abstract class Equipment {
protected abstract void playerBuyEquipment(Player player);
}
ConcreteImplementor
[java] view plain copy
print?
package cn.lynn.bridge;
public class Arms extends Equipment {
@Override
public void playerBuyEquipment(Player player) {
System.out.println(player.getGender() + "购买武器装备!");
}
}
[java] view plain copy
print?
package cn.lynn.bridge;
public class Armour extends Equipment {
@Override
public void playerBuyEquipment(Player player) {
System.out.println(player.getGender() + "购买铠甲装备!");
}
}
Client
[java] view plain copy
print?
package cn.lynn.bridge;
public class Client {
public static void main(String[] args) {
Player malePlayer = new MalePlayer();
Player femalePlayer = new FemalePlayer();
Equipment arms = new Arms();
arms.playerBuyEquipment(malePlayer);
arms.playerBuyEquipment(femalePlayer);
Equipment armour = new Armour();
armour.playerBuyEquipment(malePlayer);
armour.playerBuyEquipment(femalePlayer);
}
}
Result
[java] view plain copy
print?
男性玩家购买武器装备!
女性玩家购买武器装备!
男性玩家购买铠甲装备!
女性玩家购买铠甲装备!
将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。
二、适用性
1.你不希望在抽象和实现之间有一个固定的绑定关系的时候。例如:在程序运行时实现部分应可以被选择或切换。
2.类的抽象以及实现都应该可以通过生成子类的方法加以扩充的时候。桥接模式使你可以对不同的抽象接口和实现进行组合,并且分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响的时候,即客户的代码不必重新编译。
4.你必须将一个对象分解成两个部分的时候。
5.你想在多个对象间共享实现(可能使用引用计数),但是同时要求客户并不知情的时候。
三、参与者
1.Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction:扩充由Abstraction定义的接口。
3.Implementor:定义实现类的接口。该接口不一定要与Abstraction接口完全一致。事实上可以完全不同。一般而言,Implementor接口提供基本操作,而Abstraction接口提供较高层次操作。
4.ConcreteImplementor:实现Implementor接口,并且定义它的具体实现。
四、类图
五、示例
Abstraction
[java] view plain copy
print?
package cn.lynn.bridge;
public abstract class Player {
private Equipment equipment;
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Equipment getEquipment() {
return equipment;
}
protected abstract void buyEquipment();
}
RefinedAbstraction
[java] view plain copy
print?
package cn.lynn.bridge;
public class MalePlayer extends Player {
public MalePlayer() {
super.setGender("男性玩家");
}
@Override
public void buyEquipment() {
super.getEquipment().playerBuyEquipment(this);
}
}
[java] view plain copy
print?
package cn.lynn.bridge;
public class FemalePlayer extends Player {
public FemalePlayer() {
super.setGender("女性玩家");
}
@Override
public void buyEquipment() {
super.getEquipment().playerBuyEquipment(this);
}
}
Implementor
[java] view plain copy
print?
package cn.lynn.bridge;
public abstract class Equipment {
protected abstract void playerBuyEquipment(Player player);
}
ConcreteImplementor
[java] view plain copy
print?
package cn.lynn.bridge;
public class Arms extends Equipment {
@Override
public void playerBuyEquipment(Player player) {
System.out.println(player.getGender() + "购买武器装备!");
}
}
[java] view plain copy
print?
package cn.lynn.bridge;
public class Armour extends Equipment {
@Override
public void playerBuyEquipment(Player player) {
System.out.println(player.getGender() + "购买铠甲装备!");
}
}
Client
[java] view plain copy
print?
package cn.lynn.bridge;
public class Client {
public static void main(String[] args) {
Player malePlayer = new MalePlayer();
Player femalePlayer = new FemalePlayer();
Equipment arms = new Arms();
arms.playerBuyEquipment(malePlayer);
arms.playerBuyEquipment(femalePlayer);
Equipment armour = new Armour();
armour.playerBuyEquipment(malePlayer);
armour.playerBuyEquipment(femalePlayer);
}
}
Result
[java] view plain copy
print?
男性玩家购买武器装备!
女性玩家购买武器装备!
男性玩家购买铠甲装备!
女性玩家购买铠甲装备!
相关文章推荐
- GoF23种设计模式之结构型模式之桥接模式
- GoF23种设计模式之结构型模式之桥接模式
- GoF23种设计模式之结构型模式之适配器模式
- 23种设计模式3--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- GoF23种设计模式之结构型模式之适配器模式
- GoF23种设计模式之结构型模式之组合模式
- GoF23种设计模式之结构型模式之组合模式
- GoF23种设计模式之结构型模式之装饰模式
- GoF23种设计模式之结构型模式之代理模式
- GoF23种设计模式之结构型模式之装饰模式
- GoF23种设计模式之结构型模式之享元模式
- GoF23种设计模式之结构型模式之外观模式
- GoF23种设计模式之结构型模式之外观模式
- GoF23种设计模式之结构型模式之外观模式
- GoF23种设计模式之结构型模式之装饰模式
- GoF23种设计模式之结构型模式之代理模式
- 【结构型模式】桥接模式(Bridge)之23种java设计模式
- GoF23种设计模式之结构型模式之组合模式
- GoF23种设计模式之结构型模式之代理模式
- GoF23种设计模式之结构型模式之适配器模式