设计模式(结构型)之桥梁模式


GOF在《设计模式》中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与实现类的关系,而是组合关系。也就是说,实现部分是被抽象部分调用,以用来完成(实现)抽象部分的功能。桥梁模式的用意是“将抽象化(Abstraction)和实现化(Implementation)脱耦,使得二者可以独立地变化。”抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。实现化:抽象化给出的具体实现,就是实现化。脱耦:耦合,就是两个实体的行为的某种强关联。脱耦,就是将这种强关联去掉。强关联,就是在编译时期就确定了,无法在运行时期动态改变的关联。弱关联,就是可以动态地确定,并可以在运行时期动态地改变的关联。Java中,继承关系是强关联组合(聚合)关系是软关联。一、组成:1)抽象(Abstraction)角色:它定义了抽象类的接口而且维护着一个指向实现角色的引用
2)精确修正抽象(RefinedAbstractionSpecializedAbstraction)角色:实现并扩充由抽象角色定义的接口。
3)实现(Implementor)角色:给出了实现类的接口,这里的接口与抽象角色中的接口可以不一致实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作
4)具体实现(ConcreteImplementor)角色:给出了实现角色定义接口的具体实现。
二、UML类图:三、类图的代码描述(JAVA):以下代码来自《ThinkinginPatternswithJava》:
//抽象部分的抽象角色
classAbstraction{
//维护着一个指向实现(Implementor)角色的引用
privateImplementationimplementation;
publicAbstraction(Implementationimp){
implementation=imp;
}
//下面定义了抽象部分应该有的接口
publicvoidservice1(){
//使用了实现部分已有的接口
//组合实现功能
implementation.facility1();
implementation.facility2();
}
publicvoidservice2(){
implementation.facility2();
implementation.facility3();
}
publicvoidservice3(){
implementation.facility1();
implementation.facility2();
implementation.facility4();
}
//Forusebysubclasses:
protectedImplementationgetImplementation(){
returnimplementation;
}
}
//抽象部分的精确抽象角色
classClientService1extendsAbstraction{
publicClientService1(Implementationimp){super(imp);}
//使用抽象角色提供的方法组合起来完成某项功能
//这就是为什么叫精确抽象角色(修正抽象角色)
publicvoidserviceA(){
service1();
service2();
}
publicvoidserviceB(){
service3();
}
}
//另一个精确抽象角色,和上面一样的被我省略了
classClientService2extendsAbstraction{
//这里是直接通过实现部分的方法来实现一定的功能
publicvoidserviceE(){
getImplementation().facility3();
}
}
//实现部分的实现角色
interfaceImplementation{
//这个接口只是定义了一定的接口
voidfacility1();
voidfacility2();
voidfacility3();
voidfacility4();
}
//具体实现角色就是要将实现角色提供的接口实现
//并完成一定的功能
//这里省略了
classImplementation1implementsImplementation{……}classImplementation2implementsImplementation{……}
……在上面的程序中还体现出一点特色:就是不仅实现部分和抽象部分所提供的接口可以完全不一样;而且实现部分内部、抽象部分内部的接口也完全可以不一样。但是实现部分要提供类似的功能才行。四、详细代码实现:在这里,我用了一个具体的例子:现在我要画画,要画矩形(Rectangle)和三角形(Triangle)两种形状的形状(Shape),但是我又要画实线(SolidLine)和虚线(DotLine)两种线条(Line)。这样,我们就可以把形状看成抽象化,把线条看成实现化矩形和三角形就是修正抽象化,实线和虚线就是具体实现化JAVA:Shape.java://抽象化角色packageabstraction;
importimplementation.Line;
publicclassShape{
protectedLineline;
protectedintx1;
protectedinty1;
protectedintx2;
protectedinty2;

publicShape(){}
publicShape(Lineline,intx1,inty1,intx2,inty2){
this.line=line;
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
}
publicvoidshow(){

}
publicintcalculateArea(){
return0;
}
publicintcalculatePerimeter(){
return0;
}
}Rectangle.java://修正抽象化角色packageabstraction;importimplementation.Line;publicclassRectangleextendsShape{
publicRectangle(Lineline,intx1,inty1,intx2,inty2){
super(line,x1,y1,x2,y2);
}

publicvoidshow(){
System.out.println(“ThisisanRectangle!”);
line.draw(x1,y1,x2,y2);
}
publicintcalculateArea(){
returnMath.abs((x2-x1)*(y2-y1));
}
publicintcalculatePerimeter(){
return2*(Math.abs(x2-x1)+Math.abs(y2-y1));
}}
Triangle.java://修正抽象化角色packageabstraction;importimplementation.Line;publicclassTriangleextendsShape{
publicTriangle(Lineline,intx1,inty1,intx2,inty2){
super(line,x1,y1,x2,y2);
}

publicvoidshow(){
System.out.println(“ThisisanTriangle!”);
line.draw(x1,y1,x2,y2);
}
publicintcalculateArea(){
returnMath.abs((x2-x1)*(y2-y1))/2;
}
publicintcalculatePerimeter(){
inta=Math.abs(x2-x1);
intb=Math.abs(y2-y1);
intc=(int)Math.sqrt(a*a+b*b);
returna+b+c;
}}Line.java://实现化角色packageimplementation;publicclassLine{
protectedintx1;
protectedinty1;
protectedintx2;
protectedinty2;
publicvoiddraw(intx1,inty1,intx2,inty2){

}
}DotLine.java://具体实现化角色packageimplementation;publicclassDotLineextendsLine{
protectedintx1;
protectedinty1;
protectedintx2;
protectedinty2;
publicvoiddraw(intx1,inty1,intx2,inty2){
System.out.println(“drawSolidLine:”+x1+”,”+y1+”,”+x2+”,”+y2);
}
}SolidLine.java://具体实现化角色packageimplementation;publicclassSolidLineextendsLine{
protectedintx1;
protectedinty1;
protectedintx2;
protectedinty2;
publicvoiddraw(intx1,inty1,intx2,inty2){
System.out.println(“drawDotLine:”+x1+”,”+y1+”,”+x2+”,”+y2);
}
}
mainDraw.java://实现importabstraction.*;
importimplementation.*;publicclassmainDraw{/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
intx1=0,y1=0,x2=1,y2=1;
LinesolidLine=newSolidLine();
LinedotLine=newDotLine();
ShapesolidLineRectangle=newRectangle(solidLine,x1,y1,x2,y2);
ShapedotLineRectangle=newRectangle(dotLine,x1,y1,x2,y2);
ShapesolidLineTriangle=newTriangle(solidLine,x1,y1,x2,y2);
ShapedotLineTriangle=newTriangle(dotLine,x1,y1,x2,y2);System.out.println(“########################”);
System.out.println(“solidLineRectangle:”);
solidLineRectangle.show();
System.out.println(“area:”+solidLineRectangle.calculateArea());
System.out.println(“perimeter:”+solidLineRectangle.calculatePerimeter());
System.out.println(“########################”);
System.out.println(“dotLineRectangle:”);
dotLineRectangle.show();
System.out.println(“area:”+dotLineRectangle.calculateArea());
System.out.println(“perimeter:”+dotLineRectangle.calculatePerimeter());
System.out.println(“########################”);
System.out.println(“solidLineTriangle:”);
solidLineTriangle.show();
System.out.println(“area:”+solidLineTriangle.calculateArea());
System.out.println(“perimeter:”+solidLineTriangle.calculatePerimeter());
System.out.println(“########################”);
System.out.println(“dotLineTriangle:”);
dotLineTriangle.show();
System.out.println(“area:”+开发云主机域名dotLineTriangle.calculateArea());
System.out.println(“perimeter:”+dotLineTriangle.calculatePerimeter());

}}
输出结果:########################
solidLineRectangle:
ThisisanRectangle!
drawDotLine:0,0,1,1
area:1
perimeter:4
########################
dotLineRectangle:
ThisisanRectangle!
drawSolidLine:0,0,1,1
area:1
perimeter:4
########################
solidLineTriangle:
ThisisanTriangle!
drawDotLine:0,0,1,1
area:0
perimeter:3
########################
dotLineTriangle:
ThisisanTriangle!
drawSolidLine:0,0,1,1
area:0
perimeter:3
C++:shape.h(定义在include包中)://抽象化角色#ifndefSHAPE_H_
#defineSHAPE_H_
#include”lines.h”
#include
usingnamespacestd;
classShape{
public:
Shape(){}
Shape(Line&line,intx1,inty1,intx2,inty2){
this->line=&line;
this->x1=x1;
this->y1=y1;
this->x2=x2;
this->y2=y2;
}
virtualvoidshow()=0;
virtualintcalculateArea()=0;
virtualintcalculatePerimeter()=0;
virtual~Shape(){}
protected:
Line*line;
intx1,y1,x2,y2;
};classRectangle:publicShape{
public:
Rectangle(Line&line,intx1,inty1,intx2,inty2);
intcalculateArea();
intcalculatePerimeter();
voidshow();
virtual~Rectangle(){}
protected:
intx1,y1,x2,y2;
};
classTriangle:publicShape{
public:
Triangle(Line&line,intx1,inty1,intx2,inty2);
voidshow();
intcalculateArea();
intcalculatePerimeter();
private:
intx1,y1,x2,y2;
};#endif
line.h(定义在include包中)://实现化角色#ifndefLINES_H_
#defineLINES_H_classLine{
public:
virtualvoiddraw(intx1,inty1,intx2,inty2)=0;
virtual~Line(){};
};classSolidLine:publicLine{
public:
voiddraw(intx1,inty1,intx2,inty2);
virtual~SolidLine(){};
};classDotLine:publicLine{
public:
voiddraw(intx1,inty1,intx2,inty2);
virtual~DotLine(){};
};#endif/*LINES_H_*/
Rectangle.cpp://修正实现角色#include”../include/shape.h”
#includeRectangle::Rectangle(Line&line,intx1,inty1,intx2,inty2){
this->line=&line;
this->x1=x1;
this->y1=y1;
this->x2=x2;
this->y2=y2;
}intRectangle::calculateArea(){
returnabs((x2-x1)*(y2-y1));
}intRectangle::calculatePerimeter(){
return2*(abs(x2-x1)+abs(y2-y1));
}
voidRectangle::show(){
coutline->draw(x1,y1,x1,y2);
}
Triangle.cpp://修正实现角色#include”../include/shape.h”
#include
#include
Triangle::Triangle(Line&line,intx1,inty1,intx2,inty2){
this->line=&line;
this->x1=x1;
this->y1=y1;
this->x2=x2;
this->y2=y2;
}intTriangle::calculateArea(){
returnabs((x2-x1)*(y2-y1))/2;
}intTriangle::calculatePerimeter(){
inta=abs(x2-x1);
intb=abs(y2-y1);
intc=(int)sqrt(a*a+b*b);
returna+b+c;
}voidTriangle::show(){
coutline->draw(x1,y1,x1,y2);
}
DotLine.cpp://具体实现化角色#include”../include/lines.h”
#include
#include
usingnamespacestd;
voidDotLine::draw(intx1,inty1,intx2,inty2){
cout}
SolidLine.cpp://具体实现化角色#include”../include/lines.h”
#include
#include
usingnamespacestd;
voidSolidLine::draw(intx1,inty1,intx2,inty2){
cout}
Bridge.cpp
//实现//============================================================================
//Name:Bridge.cpp
//Author:YanChao
//Version:
//Copyright:Yourcopyrightnotice
//Description:HelloWorldinC++,Ansi-style
//============================================================================
#include”../include/shape.h”
#include”../include/lines.h”
intmain(){
intx1=0,y1=0,x2=1,y2=1;
Line*solidLine=newSolidLine();
Line*dotLine=newDotLine();
Shape*solidLineRectangle=newRectangle(*solidLine,x1,y1,x2,y2);
Shape*dotLineRectangle=newRectangle(*dotLine,x1,y1,x2,y2);
Shape*solidLineTriangle=newTriangle(*solidLine,x1,y1,x2,y2);
Shape*dotLineTriangle=newTriangle(*dotLine,x1,y1,x2,y2);coutsolidLineRectangle->show();
coutdotLineRectangle->show();
coutsolidLineTriangle->show();
coutdotLineTriangle->show();return0;
}
输出结果:solidLineRectangle:
Rectangle
drawSolidLine0,0,0,1
dotLineRectangle:
Rectangle
drawDotLine0,0,0,1
solidLineTriangle:
Triangle
drawSolidLine0,0,0,1
dotLineTriangle:
Triangle
drawDotLine0,0,0,1

相关推荐: Git常用操作命令有哪些

本篇内容介绍了“Git常用操作命令有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/05 21:06
下一篇 05/05 21:06