桥接模式(结构型)

资源下载链接:点击下载代码<=>点击下载文档

1.桥接

1.1定义

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

对象结构型模式

桥接模式的定义说明:

  • 又被称为柄体(Handle and Body)模式或接口(Interface)模式

  • 抽象关联取代了传统的多层继承

  • 将类之间的静态继承关系转换为动态的对象组合关系

1.2角色

桥接模式包含以下4个角色:

  • Abstraction(抽象类)
  • RefinedAbstraction(扩充抽象类)
  • Implementor(实现类接口)
  • ConcreteImplementor(具体实现类)
1.3优点
  • 分离抽象接口及其实现部分
  • 可以取代多层继承方案,极大地减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
1.4缺点
  • 增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情
1.5适用环境
  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承因为多层继承导致系统类的个数急剧增加的系统
1.6教学例子

(1)分析:

在这里插入图片描述

  • 蜡笔:颜色和型号两个不同的变化维度(即两个不同的变化原因)耦合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响另一个维度

  • 毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响

(2)类图:
在这里插入图片描述
(3)代码:

Abstraction(抽象类)

public abstract class BrushPen {

	protected Color color;
	
	public void setColor(Color c){
		color = c;
	}
	
	public abstract void paint();

}

RefinedAbstraction(扩充抽象类)

public class BigBrushPen extends BrushPen {

	@Override
	public void paint() {
		System.out.println("画一条大号的线条。");
		if(color != null){
			color.tint();
		}
	}

}

Implementor(实现类接口)

public interface Color {
	
	public void tint();

}

ConcreteImplementor(具体实现类)

public class GreenColor implements Color {

	@Override
	public void tint() {
		System.out.print("给它着色为绿色.");
	
	}

}
public class RedColor implements Color {

	@Override
	public void tint() {
		System.out.print("给它着色为红色.");
	}

}

Client(客户端)

public class Client {

	public static void main(String[] args) {		
		//购买颜料和笔
		Color green = new GreenColor();
		BrushPen bigBP = new BigBrushPen();
		//用笔蘸上颜料
		bigBP.setColor(green);
		//用笔画画
		bigBP.paint();
	}

}
1.7实操案例

(1)问题:

在某图形绘制软件中提供了多种不同类型的图形(shape),例如圆形(circle),三角形(triangle),长方形(rectangle)等,并为每种图形提供了多种样式,例如平面(plane)图形,立体(stereo)图形等,该软件需经常增加新的图形及新的图形样式,其初始设计方案如下:在这里插入图片描述
请结合面向对象设计原则分析该设计方案存在的问题,一种合适的设计模式对该方案进行重构,并画出类图后模拟实现。

(2)类图:在这里插入图片描述
(3)代码:

Abstraction(抽象类)

public abstract class Shape {

	protected Style s;
	public void setS(Style s) {
		this.s = s;
	}
	
	public abstract void draw();

}

RefinedAbstraction(扩充抽象类)

public class Circle extends Shape {	

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("绘制一个圆形");
		this.s.show();
	}

}
public class Rectangle extends Shape {
	
	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("绘制一个长方形");
		this.s.show();
	}

}
public class Triangle extends Shape {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("绘制一个三角形");
		this.s.show();
	}

}

Implementor(实现类接口)

public interface Style {
	public void show();
}

ConcreteImplementor(具体实现类)

public class Plane implements Style {

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("这是一个平面图像");
	}	

}
public class Stereo implements Style {	

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("这是一个立体图像");
	}

}

Client(客户端)

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Shape s = new Circle();
		Style st = new Plane();
		Style st2 = new Stereo();
		s.setS(st);
		s.draw();
		s.setS(st2);
		s.draw();
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memory沙漏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值