当前位置:网站首页>软件设计 实验四 桥接模式实验
软件设计 实验四 桥接模式实验
2022-08-05 05:13:00 【长路漫漫 大佬为伴】
一.实验目的
1)初步了解和掌握桥接模式(Bridge)的类图结构,以及主要的模式角色;
2)能够利用桥接模式的基本构造,并通过掌握的编程语言,完成实验要求的内容;
3)充分理解桥接模式如何将继承关系转换为组合关系的基本特性。
二.实验内容
1,以画笔的笔号(大、中、小)和画笔颜色(红、绿、蓝)为基础,实现画笔不同笔号与颜色的功能组合;
2,在实现画笔笔号与颜色的组合中,引入桥接模式,分别定义在该应用场景下的各个模式角色和类图。
3,通过面向对象的程序设计代码,对上述设计进行实现,使得画笔在绘制时可以动态地进行笔号与颜色的组合。
4,通过对桥接模式类图基本结构的了解,用面向对象编程语言实现一般化的桥接模式代码。
三.实验过程、
一、 模式定义
桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。
抽象化:其概念是将复杂物体的一个或几个特性抽出去而只注意其他特性的行动或过程。在面向对象就是将对象共同的性质抽取出去而形成类的过程。
实现化:针对抽象化给出的具体实现。它和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。
对于那句话:将抽象部分与他的实现部分分离套用《大话设计模式》里面的就是实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。
桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
二、 模式结构
下图是桥接模式的UML结构图:
桥接模式主要包含如下几个角色:
• Abstraction:抽象类。
• RefinedAbstraction:扩充抽象类。
• Implementor:实现类接口。
• ConcreteImplementor:具体实现类 。
三、 模式实现
模式场景是什么我们就采用哪个画图的。其UML结构图如下:
模式类图
模式结构关系如下:
四.调试和运行结果
首先是形状类:该类为一个抽象类,主要提供画形状的方法 Brush.java :
abstract class Brush
{
protected Color c;
public abstract void Paint();
public void SetColor(Color c)
{
this.c = c; }
}
分为两个类:大类和小类
大类BigBrush.java
class BigBrush extends Brush
{
public void Paint(){
System.out.println("Using big brush and color <" +c.getcolor() +"> painting");
}
}
小类SmallBrush.java
class SmallBrush extends Brush
{
public void Paint(){
System.out.println("Using small brush and color <" +c.getcolor() +"> painting");
}
}
其次是颜色类Color.java:
class Color
{
protected String color;
public String getcolor(){
return color;
}
}
分为三个颜色类:红色类,绿色类,蓝色类
红色类Red.java
class Red extends Color
{
public Red()
{
this.color = "red"; }
}
绿色类Green.java
class Green extends Color
{
public Green()
{
this.color = "green"; }
}
蓝色类:Blue.java
class Blue extends Color
{
public Blue()
{
this.color = "blue"; }
}
客户端:Program.java
public class Program {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Brush b = new BigBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();
b = new SmallBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();
}
}
通过上面的代码,我们就可以通过桥接模式来实现以画笔的笔号(大、中、小)和画笔颜色(红、绿、蓝)为基础,实现画笔不同笔号与颜色的功能组合
五.实验总结
效果及实现要点:
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同汽车。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
适用性:
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
总结:
Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。
边栏推荐
猜你喜欢
【过一下10】sklearn使用记录
Error creating bean with name 'configDataContextRefresher' defined in class path resource
逆向理论知识4
一篇博客通关Redis技术栈
【过一下7】全连接神经网络视频第一节的笔记
【过一下4】09-10_经典网络解析
Wise Force Deleter强制删除工具
WPF中DataContext作用
OFDM 十六讲 5 -Discrete Convolution, ISI and ICI on DMT/OFDM Systems
u-boot debugging and positioning means
随机推荐
u-boot中的u-boot,dm-pre-reloc
【过一下3】卷积&图像噪音&边缘&纹理
【Untitled】
[Decoding tools] Some online tools for Bitcoin
Flutter TapGestureRecognizer 如何工作
【过一下11】随机森林和特征工程
Flutter learning 2-dart learning
How does the Flutter TapGestureRecognizer work
A blog clears the Redis technology stack
【cesium】Load and locate 3D Tileset
uva1325
2022 Hangzhou Electric Multi-School 1st Session 01
结构光三维重建(二)线结构光三维重建
【软考 系统架构设计师】软件架构设计③ 特定领域软件架构(DSSA)
Redis - 13. Development Specifications
Redis - 13、开发规范
uboot enable debug printing information
Flutter学习2-dart学习
Structured light 3D reconstruction (1) Striped structured light 3D reconstruction
【过一下10】sklearn使用记录