桥接模式--学习笔记

不管是门面模式,适配器模式,还是现在将的桥接模式,核心思想只有一个:就是软件人员在进行代码编写的时候,对于两个类之间需要进行关联时,不要直接在一个类的代码中调用另一个类的代码,而是要通过这些设计模式,在两个类之间建立一个类似缓冲器的类,从而将直接关联的两个类进行解耦。

桥接模式,顾名思义:就是把两个类进行关联,例如现在有两个类,奖金类-----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();
   }
}


看到了吗?把Department传给他!定义完两个类,我们就可以来实现他们了,首先是第一个大类:部门:销售部+人事部+策划部。

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();
	}
}

输出结果:

正在计算个人奖金:
人事部
正在计算团体奖金
人事部







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值