1.认识桥接模式
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
具体的例子有很多,如不同颜色和字体的文字、不同品牌和功率的汽车等。如果用继承方式,m种颜色和n种字体的文字就有m×n种,不但对应的子类很多,而且扩展困难如果用桥接模式就能很好地解决这些问题。
最大特点就是聚合关系在桥梁里面,具体的业务逻辑由子类完成
2.例子
比如不同的学生穿不同的服装
(1)先定义一个服装接口,并且实例化两个具体的服装
public interface Clothes {
String getName();
}
public class Uniform implements Clothes {
@Override
public String getName() {
return "校服";
}
}
public class Shirt implements Clothes {
@Override
public String getName() {
return "衬衫";
}
}
(2)定义一个虚类,实现桥梁
public abstract class Person {
Clothes mClothes;
public void setClothes(Clothes clothes) {//聚合关系建立在抽象层
mClothes = clothes;
}
protected abstract void dress();//穿衣服,也就是具体的业务
}
(3)拓展桥梁,实现具体业务
public class Student extends Person {
@Override
protected void dress() {
System.out.println("学生穿上" + mClothes.getName());
}
}
(4)测试代码
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setClothes(new Shirt());
student.dress();
}
}
3.桥接模式在android中的体现
典型的就是Adapter跟AdapterView
image
4.实战
假设现在有主模块MainModule,里面包含一个AModule.此时AModule需要去请求MainModule的数据,此时可以怎么做呢?首先想到java.util.observable,发个消息给MainModule,请求完了再发送回来.从代码的角度没问题,但是实现起来却是有问题的.我们需要考虑在哪里监听这个observable.在activity里面?问题是这个请求和这个activity明显无关,不合理.放在Application里面?更不行,Application是处理全局变量或者第三方的注册的.从业务的逻辑来讲无法实现,或者说实现方法很不合理,那怎么办呢?这个时候就是桥接模式了.
(1)在ModuleA里面定义接口
public interface IModuleService {
String getMainData();
}
(2)在MainModule实现该接口(毕竟目的是获取MainModule里面的数据)
public class ModuleServiceImpl implements IModuleService {
@Override
public String getMainData() {
return "you are my sunshine";//简单写了,通常会请求网络之类的
}
}
(3)设计桥梁,建立IModuleService和IServiceCenter之间的联系,不过这里只是声明,并没有实现
public interface IServiceCenter {
<T> void registerService(Class<T> type, T service);
<T> T getService(Class<T> type);
}
(4)实现这个桥梁,起到连接的作用(因为需要在MainModule注册和ModuleA获取数据,所以写在ModuleA里面)
public class ServiceCenterImpl implements IServiceCenter {
private static final ServiceCenterImpl singleton = new ServiceCenterImpl();
private ServiceCenterImpl() {
}
public static ServiceCenterImpl getInstance() {
return singleton;
}
private HashMap<Class<?>, Object> mServices = new HashMap<>();
@Override
public <T> void registerService(Class<T> type, T service) {
mServices.put(type, type.cast(service));
}
@Override
public <T> T getService(Class<T> type) {
return type.cast(mServices.get(type));
}
}
(5)测试
主工程注册
ServiceCenterImpl.getInstance().registerService(IModuleService.class, new ModuleServiceImpl());
ModuleA获取数据
String data = ServiceCenterImpl.getInstance().getService(IModuleService.class).getMainData();
网友评论