GOF23设计模式之:桥接模式
桥接模式实际开发中应用场景
-
JDBC驱动程序
-
AWT中的Peer架构
-
银行日志管理
-
格式分类:操作日志,交易日志,异常日志
-
距离分类:本地记录日志,异常记录日志
-
-
人力资源系统中的奖金计算模块
-
奖金分类:个人奖金,团体奖金,激励奖金
-
部门分类:人事部门,销售部门,研发部门
-
-
OA系统中的消息处理
-
业务类型:普通消息,加急消息,特急消息
-
发送消息方式:系统内消息,手机短信,邮件
-
场景
-
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售问题?
-
我们可以用
多层继承结构
实现下图的关系
-
问题
-
扩展性问题(类个数膨胀问题)
-
如果要增加一个新的电脑类型,智能手机,则要增加各个品牌下面的类
-
如果要增加一个新的品牌,也要增加各种电脑类型的类
-
-
违反单一职责原则
- 一个类:联想笔记本,有两个引起这个类变化的原因
-
场景分析
-
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
-
这个场景中有两个变化的维度:电脑类型,电脑品牌
桥接模式核心要点
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展,在抽象层建立关联
/**
* 品牌接口
* @author Matrix42
*
*/
public interface Brand {
void sale();
}
class Lenovo implements Brand{
@Override
public void sale() {
System.out.println("销售联想电脑");
}
}
class Dell implements Brand{
@Override
public void sale() {
System.out.println("销售戴尔电脑");
}
}
/**
* 电脑抽象类
* @author Matrix42
*
*/
public abstract class Computer {
protected Brand brand;
public Computer(Brand b){
this.brand = b;
}
public void sale(){
brand.sale();
}
}
class Desktop extends Computer{
public Desktop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
}
class Laptop extends Computer{
public Laptop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}
public class Client {
public static void main(String[] args) {
//销售联想的笔记本电脑
Computer c = new Laptop(new Lenovo());
c.sale();
//销售联想的笔记本电脑
Computer c2 = new Desktop(new Dell());
c2.sale();
}
}