桥接模式(java)

初探桥接模式


在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案:

方案一:为每种形状都提供各种颜色的版本。
方案二:根据实际需要对颜色和形状进行组合。

方案一

对于中两个图形,我们都会很清楚这样一个问题:假入我们添加椭圆,我们是不是又要增加三种颜色呢?假如我们在增加一个绿色,我们就要增加其四种形状了,继续加。继续加……每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这样的情况我想每个程序员都不会想要吧!那么我们看方案二。

方案二

方案二所提供的就是解决方法是:提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合


对于方案二这种思想方法我们叫做 桥接模式

了解桥接模式

现有Color 和 Shape两个类别的东东,Shape可能是Circle,Triangle …,Color 可能是Red,Green…,所谓桥接就是将Color和Shape组合,桥接;
优点:

1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明

"1.抽象与实现分离"----->放在后面理解
缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

桥接模式实例


抽象层

桥接接口Color

package bridge_pattern_about.myunderstand;

public interface Color {
	void paint(String shapeType);
	//	String getColor();
}

抽象类Shape

package bridge_pattern_about.myunderstand;

public abstract class Shape {
	Color color;
	//	桥接点,每new一个Shape,会对应一个特定的桥接接口Color
	//	抽象层面的每个Shape对应接口Color共笛卡尔积个Shape和Color的组合
	//	即共计Math(Shape.Color)个组合
	public Shape(Color color) {
		this.color = color;
	}
	public abstract void draw();
	//	public abstract void drawBySelf();
}

可见在抽象层组合的方式和轮廓已经完成,接下来交给实现类区完成即可


实现层

Shape实现类

package bridge_pattern_about.myunderstand;

public class Circle extends Shape {
	private String shapeType = "Circle";
	//	private String colorType = color.getColor();

	public Circle(Color color) {
		super(color);
	}

	@Override
	public void draw() {
		super.color.paint(shapeType);
	}
	
	/**
	@Override
	public void drawBySelf() {
		System.out.println(shapeType + " : " + colorType + " at:<" + this.getClass() + ">");
	}*/
}

Color桥接实现类

package bridge_pattern_about.myunderstand;

public class Red implements Color {
	//	String colorType = "red";

	@Override
	public void paint(String shapeType) {
		System.out.println(shapeType + " : " + colorType + " at:<" + this.getClass() + ">");
	}
	/*
	@Override
	public String getColor() {
		return colorType;
	}*/
}

客户测试类BridgePatternDemo

package bridge_pattern_about.myunderstand;

public class BridgePatternDemo {
	public static void main(String[] args) {
		Shape circle = new Circle(new Red());
		circle.draw();
		//	circle.drawBySelf();
		//	Shape triangle = new Triangle(new Green());
		//	triangle.draw();
	}
}

对一些代码进行了注释,其实是做了一些简单的测试:Color和Shape进行组合,那么可以是Shape将自己的信息拿给Color,让Color进行组合搭配输出,也可以是Shape主动向Color索要信息,自己进行搭配输出


实际上Color和Shape怎么组合早在抽象层就已经是设计好了,抽象层需要什么就去找实现类去要即可----->抽象与实现分离


去掉代码部分的相关注释运行结果如下
运行结果

Circle : red at:<class bridge_pattern_about.myunderstand.Red>
Circle : red at:<class bridge_pattern_about.myunderstand.Circle>
Triangle : green at:<class bridge_pattern_about.myunderstand.Green>

读图理解

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值