不管是门面模式,适配器模式,还是现在将的桥接模式,核心思想只有一个:就是软件人员在进行代码编写的时候,对于两个类之间需要进行关联时,不要直接在一个类的代码中调用另一个类的代码,而是要通过这些设计模式,在两个类之间建立一个类似缓冲器的类,从而将直接关联的两个类进行解耦。
桥接模式,顾名思义:就是把两个类进行关联,例如现在有两个类,奖金类-----Bonus ,部门类-----Department. 奖金分为:个人奖金,团队奖金,进步奖金。部门分为:人事部,销售部,策划部。如果不使用桥接模式(组合),而使用继承模式(继承),来简历他们的联系。代码清单如下。
奖金:
public class Bonus(){
public void computerBonus(){
}
}
个人奖金:
public class PeopleBonus extends Bonus{
public void computerBonus(){
System.out.print("正在计算个人奖金");
}
}
团队奖金:
public class TeamBonus extends Bonus{
public void computerBonus(){
System.out.print("正在计算团队奖金"):
}
}
进步奖金:省略,
销售部个人奖金:
public class SalePeopleBonus extends PeopleBonus{
public void computerBonus() {
System.out.println("销售部个人奖金");
super.computerBonus();
}
}
public class HrPeropleBonus extends PeopleBonus{
public void computerBonus() {
System.out.println("人事部个人奖金");
super.computerBonus();
}
}
策划部个人奖金:省略。
后面还有:销售部团队奖金,人事部团队奖金,策划部团队奖金。
销售部进步奖金,人事部进步奖金,策划部进步奖金。
我们发现一个超级严重的问题!这个继承体系很庞大,虽然继承关系很清晰,但是这些类的关系统统写死了!!!你改变不得,你一改变父类,子类必要改!例如,现在奖金类-----Bonus,除了要实现计算奖金的功能,还要统计总共发放了多少奖金,一想很简单呀!so easy!
那不就是这样:‘
public class Bonus{
public void computerBonus(){
}
//增加第二个方法
public void computerAllMoney(){
}
}
是啊!!很简单!!但是你后面的子类通通要修改代码了!!!这下你爽了!!!慢慢改啊。。加油!!!
所以我们发现如果功能发生改变,代码的一改变,使用继承关系,子类必受影响。那么我们现在介绍使用桥接模式来解决这个问题,先分析一下,整个事件中,有两个关键词:部门+奖金,所以我们现在要解决的就是让他们之间相互独立,独立运作!!各自发生改变都不能影响另一方!这就是我们要的效果。
我们首先定义一个部门接口:
public interface Department {
//定义一个共同的要实现的方法
public void computerBonus();
}
在来定义一个抽象的奖金类,并!并!并!!建立他们之间的连接!!!!
public abstract class Bonus {
private Department department;
public Bonus(Department department){
this.department=department;
}
public void computerBonus(){
department.computerBonus();
}
}
public class HrDepartment implements Department{
@Override
public void computerBonus() {
System.out.println("人事部");
}
}
public class SaleDepartment implements Department{
public void computerBonus() {
System.out.println("销售部门奖金计算");
}
}
public class 策划 implements Department{
public void computerBonus() {
System.out.println("策划部门奖金计算");
}
}
接着是第二大类:奖金:个人奖金+团队奖金+进步奖金
public class PeopleBonus extends Bonus{
public PeopleBonus(Department department) {
super(department);
}
public void computerBonus() {
System.out.println("正在计算个人奖金:");
super.computerBonus();
}
}
public class TeamBonus extends Bonus{
public TeamBonus(Department department) {
super(department);
}
public void computerBonus() {
System.out.println("正在计算团体奖金");
super.computerBonus();
}
}
那么你建立他们的时候,就可以使用组合!!!来建立他们
public class Main {
public static void main(String[] args) {
Bonus peopleBonus=new PeopleBonus(new HrDepartment());
peopleBonus.computerBonus();
Bonus teamBonus=new TeamBonus(new HrDepartment());
teamBonus.computerBonus();
}
}
输出结果:
正在计算个人奖金:
人事部
正在计算团体奖金
人事部