设计模式-桥接模式

背景

  我们在日常生活中会遇到这样的场景:去西餐厅点牛排时,服务员会问你要眼肉、西冷还是菲力(部位),然后有时还会问其他维度的:要日本和牛、澳洲和牛还是澳洲安格斯牛。。。在软件开发中,我们也会碰到这种场景:类的变化维度有多个,如果用继承的方法去实现,会有类爆炸的问题,这时桥接模式就是来解决这类问题。

角色

  实现化角色:是一接口,代表某一种维度
  具体实现化角色:实现化角色的具体实现,该维度有几种变化,就有几个具体实现化类
  抽象化角色:是一抽象化类,并有一实现化角色类型的属性,通常由构造函数传入-赋值,代表另一种维度
  具体抽象化角色:抽象化角色的具体实现,该维度有几种变化就对应有几个具体的具体抽象化角色

代码实现

	/**
	 * 实现化角色:牛种维度
	 */
	public interface CattleBreed {
	
	    String BreedingGround();
	
	}
	
	
	/**
	 * 具体实现化角色:日本和牛
	 */
	public class RibenHeNiu implements CattleBreed {
	
	    @Override
	    public String BreedingGround() {
	        return "日本和牛";
	    }
	
	}
	
	/**
	 * 具体实现化角色:澳洲和牛
	 */
	public class AozhouHeNiu implements CattleBreed {
	
	    @Override
	    public String BreedingGround() {
	        return "澳洲和牛";
	    }
	
	}
	
	/**
	 * 具体实现化角色:澳洲安格斯牛
	 */
	public class AozhouAgsNiu implements CattleBreed {
	
	    @Override
	    public String BreedingGround() {
	        return "澳洲安格斯牛";
	    }
	
	}
	
	
	/**
	 * 抽象化角色:牛的部位
	 */
	public abstract class CattlePart {
	
	    protected CattleBreed breed;
	
	    public CattlePart(CattleBreed breed) {
	        this.breed = breed;
	    }
	
	    public abstract void order();
	
	}
	
	/**
	 * 具体抽象化角色:眼肉
	 */
	public class YanRou extends CattlePart {
	
	    public YanRou(CattleBreed breed) {
	        super(breed);
	    }
	
	    @Override
	    public void order() {
	        String s = this.breed.BreedingGround() + ":眼肉";
	        System.out.println(s);
	    }
	
	}
	
	/**
	 * 具体抽象化角色:西冷
	 */
	public class XiLeng extends CattlePart {
	
	    public XiLeng(CattleBreed breed) {
	        super(breed);
	    }
	
	    @Override
	    public void order() {
	        String s = this.breed.BreedingGround() + ":西冷";
	        System.out.println(s);
	    }
	}
	
	/**
	 * 具体抽象化角色:菲力
	 */
	public class FeiLi extends CattlePart {
	
	    public FeiLi(CattleBreed breed) {
	        super(breed);
	    }
	
	    @Override
	    public void order() {
	        String s = this.breed.BreedingGround() + ":菲力";
	        System.out.println(s);
	    }
	}
	
	
	/**
	 * 测试类
	 */
	public class Test {
	
	    public static void main(String[] args) {
	        CattleBreed ribenHeNiu = new RibenHeNiu();
	
	        new YanRou(ribenHeNiu).order();
	        new XiLeng(ribenHeNiu).order();
	        new FeiLi(ribenHeNiu).order();
	
	        CattleBreed aozhouHeNiu = new AozhouHeNiu();
	        new YanRou(aozhouHeNiu).order();
	        new XiLeng(aozhouHeNiu).order();
	        new FeiLi(aozhouHeNiu).order();
	    }
	
	}

  运行结果如下:

在这里插入图片描述

优缺点

  优点:

  • 提高了系统的可扩展性:任一维度需要增加,都不需要修改原有系统
  • 减少了类的个数:若2个变化维度,一个有x种,另一个有y种,使用继承需要x*y个子类;而用桥接模式只需要x+y个类
  • 降低了系统的耦合度

  缺点:

  • 增加系统的理解与设计难度
  • 要求开发者能识别出系统独立变化的维度,对开发者要求较高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值