设计模式之桥接模式bridge
场景
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
这个场景中有两个变化维度:电脑类型、电脑品牌
多层继承结构实现问题
- 扩展性问题(个数膨胀问题)
- 如果要增加一个新的电脑类型智能手机,则要增加各个品牌下面的类
- 如果要增加一个新的品牌,也要增加各种电脑类型的类
- 违反单一职责原则
- 一个类:联想笔记本,有两个引起这个类变化的原因
代码示例
public interface Computer {
void sale();
}
class Desktop implements Computer{
@Override
public void sale() {
System.out.println("销售台式机");
}
}
class Laptop implements Computer{
@Override
public void sale() {
System.out.println("销售笔记本");
}
}
class Pad implements Computer{
@Override
public void sale() {
System.out.println("销售平板");
}
}
//联想系列
class LenovoDesktop extends Desktop{
@Override
public void sale() {
System.out.println("销售联想台式机");
}
}
class LenovoLaptop extends Laptop{
@Override
public void sale() {
System.out.println("销售联想笔记本");
}
}
class LenovoPad extends Pad{
@Override
public void sale() {
System.out.println("销售联想平板");
}
}
//神州系列
class ShenzhouDesktop extends Desktop{
@Override
public void sale() {
System.out.println("销售神州台式机");
}
}
class ShenzhouLaptop extends Laptop{
@Override
public void sale() {
System.out.println("销售神州笔记本");
}
}
class ShenzhouPad extends Pad{
@Override
public void sale() {
System.out.println("销售神州平板");
}
}
//戴尔系列
class DellDesktop extends Desktop{
@Override
public void sale() {
System.out.println("销售戴尔台式机");
}
}
class DellLaptop extends Laptop{
@Override
public void sale() {
System.out.println("销售戴尔笔记本");
}
}
class DellPad extends Pad{
@Override
public void sale() {
System.out.println("销售戴尔平板");
}
}
桥接模式核心
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联
代码
品牌类
public interface Brand {
void sale();
}
class Lenovo implements Brand{
@Override
public void sale() {
System.out.println("销售联想电脑");
}
}
class Shenzhou implements Brand{
@Override
public void sale() {
System.out.println("销售神州电脑");
}
}
class Dell implements Brand{
@Override
public void sale() {
System.out.println("销售戴尔电脑");
}
}
客户端
public class Client {
public static void main(String[] args){
//用组合的方式增加品牌
Computer2 computer2 = new Laptop2(new Lenovo());
computer2.sale();
Computer2 computer21 =new Laptop2(new Dell());
computer21.sale();
//增加台式机
Computer2 computer22 = new Desktop2(new Lenovo());
Computer2 computer23 = new Desktop2(new Dell());
}
}
场景
银行日志管理
- 格式分类:操作日志、交易日志、异常日志
- 距离分类:本地记录日志、异地记录日志
人类资源系统的奖金计算模块
- 奖金分类:个人奖金、团体奖金、激励奖金
- 部门分类:人事部门、销售部门、研发部门
OA系统中的消息处理
- 业务类型:普通消息、加急消息、特急消息
- 发送消息方式:系统内消息、手机短信、邮件