桥接模式是什么?
将抽象部分与它的实现部分分离,使它们都可以独立地变化
桥接模式解决什么问题?
当有手机品牌A和B
public class PhoneBrand {
public void run() {
}
}
class PhoneBrandA extends PhoneBrand {
}
class PhoneBrandB extends PhoneBrand {
}
每个手机品牌都拥有游戏和通讯录功能
class PhoneBrandAGame extends PhoneBrandA{
@Override
public void run() {
System.out.println("运行品牌A的游戏");
}
}
class PhoneBrandBGame extends PhoneBrandB{
@Override
public void run() {
System.out.println("运行品牌B的游戏");
}
}
class PhoneBrandAAddressList extends PhoneBrandA{
@Override
public void run() {
System.out.println("运行品牌A的通讯录");
}
}
class PhoneBrandBAddressList extends PhoneBrandB{
@Override
public void run() {
System.out.println("运行品牌B的通讯录");
}
}
调用时
new PhoneBrandAGame().run();
new PhoneBrandBGame().run();
new PhoneBrandAAddressList().run();
new PhoneBrandBAddressList().run();
-
当新增功能时,每个品牌都要新增一个类
-
当新增品牌时,每个功能也要新增一个类
桥接模式实现
创建Soft及其子类游戏和通讯录功能
abstract class Soft {
abstract void run();
}
class Game extends Soft {
@Override
void run() {
System.out.println("游戏");
}
}
class AddressList extends Soft {
@Override
void run() {
System.out.println("通讯录");
}
}
创建品牌类,将Soft作为域
abstract class Brand {
protected Soft mSoft;
public void setSoft(Soft soft) {
mSoft = soft;
}
abstract void run();
}
class BrandA extends Brand{
@Override
void run() {
System.out.print("运行品牌A的");
mSoft.run();
}
}
class BrandB extends Brand{
@Override
void run() {
System.out.print("运行品牌B的");
mSoft.run();
}
}
调用过程
BrandA brandA = new BrandA();
brandA.setSoft(new Game());
brandA.run();
BrandB brandB = new BrandB();
brandB.setSoft(new Game());
brandB.run();
brandA.setSoft(new AddressList());
brandA.run();
brandB.setSoft(new AddressList());
brandB.run();
当新增功能或品牌时,只需要新增一个类,不会影响其他的类