java设计模式(五)--桥接模式

    对于桥接模式,在我看来,就是将实体与动作的实现进行分离,举一个例子,我们要画一个圆形和正方形,分别是红色和绿色的。

    如果我们用之前的抽象模式进行创建的话,先让圆形和正方形继承一个图形类,然后再用两个类来分别实现圆形和正方形的红色和绿色画法,这样的话会导致重复代码过多,由于继承关系太多,就会不利于后期的维护,以后也会由于形状和颜色的增多,也回导致这个结构会变得很庞大。

    由此,我们用到了桥接模式,桥接模式他将这两种关系分成了两个大类,一个是管理形状的抽象父类,一个是管理画不同颜色的形状的接口,通过父类来调用接口的实现类的方法达到与实例相同的结果,并且会与前一种方法更优。

    在网络上的专业解释:

    桥接是用于把抽象化于实现化解耦,使得二者可以独立变化,他通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦,使得实体类的功能独立于桥接接口实现,这两种类型的类可被结构化改变而互不影响。

输入图片说明

    我就附上我对上面试的实例所写的第二种方式的代码了:

形状的抽象父类及实现类:

public abstract class Shape {
	protected DrawAPI drawAPI;
	public Shape(DrawAPI drawAPI){
		this.drawAPI=drawAPI;
	}
	public abstract void draw();
}

public class Square extends Shape {
	private int height;//高度
	private int width;//宽度
	public Square(DrawAPI drawAPI,int height,int width) {
		super(drawAPI);
		this.height=height;
		this.width=width;
	}
	@Override
	public void draw() {
		drawAPI.drawSquare(width, height);
	}
}


public class Circle extends Shape {
	private int radius;//半径
	private int x;//圆心x坐标
	private int y;//圆心y坐标
public Circle(DrawAPI drawAPI,int radius,int x,int y) {
		super(drawAPI);
		this.radius=radius;
		this.x=x;
		this.y=y;
	}
	@Override
	public void draw() {
		drawAPI.drawCircle(radius, x, y);
	}
}

所画不同颜色的接口及实现类:

interface DrawAPI {
	void drawCircle(int radius,int x,int y);
	void drawSquare(int width,int height);
}


public class GreenDraw implements DrawAPI {
	@Override
	public void drawCircle(int radius, int x, int y) {
		System.out.println(String.format("画一个绿色的,半径为: %d 的,圆点坐标是 (%d,%d) 的圆", radius,x,y));
	}
	@Override
	public void drawSquare(int width, int height) {
		System.out.println(String.format("画一个绿色的,长为: %d 的,宽为: %d 的正方形", height,width));
	}
}


public class RedDraw implements DrawAPI {
	@Override
	public void drawCircle(int radius, int x, int y) {
		System.out.println(String.format("画一个红色的,半径为: %d 的,圆点坐标是 (%d,%d) 的圆", radius,x,y));
	}
	@Override
	public void drawSquare(int width, int height) {
		System.out.println(String.format("画一个红色的,长为: %d 的,宽为: %d 的正方形", height,width));
	}
}

测试类:

public class Test {
	public static void main(String[] args) {
		System.out.println("圆形:");
		Shape circle1=new Circle(new RedDraw(), 12, 4, 5);
		Shape circle2=new Circle(new GreenDraw(), 78, 3, 7);
		circle1.draw();
		circle2.draw();
		System.out.println("正方形:");
		Shape square1=new Square(new RedDraw(), 23, 11);
		Shape square2=new Square(new GreenDraw(), 56, 34);
		square1.draw();
		square2.draw();
	}
}

控制台显示:

圆形:
画一个红色的,半径为: 12 的,圆点坐标是 (4,5) 的圆
画一个绿色的,半径为: 78 的,圆点坐标是 (3,7) 的圆
正方形:
画一个红色的,长为: 23 的,宽为: 11 的正方形
画一个绿色的,长为: 56 的,宽为: 34 的正方形

转载于:https://my.oschina.net/u/3631883/blog/1507037

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值