java设计模式(八):桥接模式

目录

一:桥接模式

1.问题引出

2.引出概念

二:代码讲解

 1.手机品牌的抽象以及实现

2.手机软件的抽象和实现

3.聚合

4.测试

三:说明


一:桥接模式

1.问题引出

  现在有这么一个类叫做手机品牌,其中有这么些属性:手机品牌名称,通讯录,游戏等。那么他创建的对象就如下图所示:

      

      如上图所示,创建了多个对象 每一个对象都至少包含着3个属性,那么有这样问题产生了:如果新出的一个手机品牌没有游戏呢?如果新出的一个手机品牌还有音乐软件呢?前者实现可能简单,但是后者就需要在代码运行时做动态修改了。

     如果我们将问题分解一下,这个手机品牌拆解成手机品牌和手机软件。也就是说通讯录,游戏包含后面的音乐等都被抽象成一个手机软件了。如下图:

 

2.引出概念

   我们还是看上面的第一幅图:在第一幅图中,每一个层次的关系都是以继承来实现。再来看第二幅图:手机品牌把继承关系改成了包含关系。这种就很符合了java开发设计中的“开-闭”原则,尽量把继承关系改成聚合/合成原则。关于聚合和合成大家可以自行的百度。

   官方对于桥接模式的定义为:“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这其中包含了三个关键词:抽象化,实现化,解耦。

   抽象化:把共同的特性抽象脱离出来。就比如上图中把通讯录,游戏等抽象成手机软件。

   实现化:对于抽象化的实现。就如上图通讯录,游戏,音乐等等就是对手机软件的实现。

   解耦:将强关系改成弱关系。就比如上图手机品牌和耍手机软件就变成了一个弱关系了,就是说手机品牌可以包含手机软件也

               可以不包含,而不像第一幅图设计一样一定被包含进去了(不管是不是为null)。

 

二:代码讲解

 1.手机品牌的抽象以及实现

  

package test.com;

/**
 * 手机品牌的抽象
 * @author monxz
 *
 * @time  2019年7月18日
 */
public abstract class PhoneBrand {
   public abstract  void  phoneBrandName();
}
package test.com;

/**
 * 手机品牌的抽象实现
 * @author monxz
 *
 * @time  2019年7月18日
 */
public class PhoneBrandImpl extends PhoneBrand{

	@Override
	public void phoneBrandName() {
		System.err.println("手机品牌:三星手机");
		
	}

}
package test.com;

/**
 * 手机品牌的抽象实现
 * @author monxz
 *
 * @time  2019年7月18日
 */
public class PhoneBrandImpl2 extends PhoneBrand{

	@Override
	public void phoneBrandName() {
		System.err.println("手机品牌:苹果手机");
		
	}

}

2.手机软件的抽象和实现

package test.com;

public abstract class sofeWare {
  public abstract  void  sofeWare();
}
package test.com;

/**
 * 手机软件的抽象实现
 * @author monxz
 *
 * @time  2019年7月18日
 */
public  class sofeWareImpl extends sofeWare{

	@Override
	public void sofeWare() {
		System.err.println("手机软件qq");
		
	}
 
}
package test.com;

/**
 * 手机软件的抽象实现
 * @author monxz
 *
 * @time  2019年7月18日
 */
public  class sofeWareImpl2 extends sofeWare{

	@Override
	public void sofeWare() {
		System.err.println("手机软件微信");
		
	}
 
}

3.聚合

package test.com;

public  class Phone {
  private PhoneBrand  phoneBrand;
  private sofeWare  sofeWare;
	public PhoneBrand getPhoneBrand() {
		return phoneBrand;
	}
	public void setPhoneBrand(PhoneBrand phoneBrand) {
		this.phoneBrand = phoneBrand;
	}
	public sofeWare getSofeWare() {
		return sofeWare;
	}
	public void setSofeWare(sofeWare sofeWare) {
		this.sofeWare = sofeWare;
	}
  
    public void phoneBrandName() {
    	phoneBrand.phoneBrandName();
    }
    
    public void sofeWare() {
    	sofeWare.sofeWare();
    }
}

4.测试

package test.com;

public class test {
	 public static void main(String[] args) {
		Phone phone=new Phone();
		phone.setPhoneBrand(new PhoneBrandImpl());
		phone.setSofeWare(new sofeWareImpl());
		phone.phoneBrandName();
		phone.sofeWare();
	}
}

                                              

三:说明

  桥接模式是java中直接运用的比较少的模式,但是他透露出了java的特性,可以很好的理解java的设计与开发。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值