通过本文将学习到
1、前言
2、桥接模式的概念
3、桥接模式的UML图
4、桥接模式的实现
5、桥接模式的优缺点及使用环境
6、总结
今天上了一个大佬的课,在聊大学学的东西。数据结构、编译原理、软件工程、算法导论、离散数学、....这些,从30年前大学开启计算机这门学科开始就没怎么变过。换句话说这些东西是内功想以后走的远,内功不高,怕是成就一般哦!并且基础的东西也就那么多!并不是不可以掌握的,这个是我接下来两年需要需要关注的一个点,理论和实践!通过两年时间将这一块弄熟!
接着大佬又聊到了,第一份工作。我的想法是去小公司,因为可以做很多东西,熟悉工具。但是大佬却不一样的看法,一个人的眼界觉得自己的成就高低。通过在大公司规范的模式,能够让自己少走很多弯路。我突然觉得这个观点也很对,因为我只想着自己学到技术,然后自己帮人做网站,但是没考虑到当人数变多时如何管理!想做大做强,有个现成的模仿是最快的了!去学习别人的管理模式,别人的运营模式。
最后,我说2年以后要自己做工作室!因为,我看到一些学长毕业两年就自己做了的公司。但是,我没思考过的是别人大学是怎么过的,别人在大学的时候,就已经开始在软件这个行业开始准备了。实际上别人已经做了很多年的准备!我,一没技术,二没资源。如果成立了,除了倒闭我想不到有任何出路!但是,我不可能因为自己不会,没准备就不干了啊!自己做自己的主这才是出路啊!所以,我要制定一系列的计划。从技术方面、资金方面、销售方面、管理方面。每一个点都需要做出准备。不然,我就只可能是个炮灰而已!一个初出茅庐的小伙子,无论怎么看,别人都觉得不靠谱!且,不可以放弃,这个点很重要。只有将财务自由,才能够更好的主宰自己的命运。
桥接模式是一种结构型模式,如果系统中的某个类存在俩个独立的维度,通过桥接模式可以将这两个维度分离出来,使两者可以独立扩展。
桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立扩展!
在学习设计模式之前我们要明确一点,我们不是闲着无聊敲敲代码而已!而是,有具体的需要,解决问题。使问题更加容易解决!
桥接模式是为了将对象的不同属性进行分离,既是解耦的过程。举个栗子:蜡笔和毛笔大家在生活中有见到过。蜡笔有颜色和型号之分。而毛笔只有幸好之分,颜色是用啥颜色就是啥色。比如:我需要大、中、小三种类型的蜡笔,颜色都是7种那么。我们需要为每一种蜡笔创建每一个不同的颜色的类。3*7=21只蜡笔!但是如果用毛笔的话,我就只要3种类型的毛笔,外加7种颜色,想要啥颜色的就直接用毛笔蘸墨水。3+7=10。可以看出明显减少了类的创建!减少了复杂度。并且,假设以后要添加型号,那么毛笔只要加一个不同的型号类,而蜡笔,需要为这个型号类加上7只不同颜色的笔。综上所述:蜡笔之所以会出现这种原因是因为,将颜色和型号给绑定在一起了。我们需要干的就是将其分离。然两个维度各自单独扩展!
画笔的型号与颜色可以看成是两个不同的维度。
画个图好理解。
因此我们的任务就是将两个关联在一的属性,耦合在一起的属性进行解耦。做成毛笔类型。
Abstraction(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以为维护对象,就是将两个接口进行关联。既可以包含抽象业务,也可以包含具体业务。
RefinedAbstraction(扩充抽象类):它扩充由Abstraction定义的接口,通常情况下它不再是抽像类而是具体的类。实现了在Abstraction中定义的抽象方法,在其也能掉哦那个implementor.的业务方法。
Implmentor(实现类接口):它是定义实现类的接口,就是颜色类型。给它上色。
ConcreteImplmentor(具体实现类):具体实现抽象类的业务。
来个实例呗 。
颜色接口(ColorInterface):首先写接口类,是因为它是毛笔类的属性。
package bridgePattern;
/**
*
* Title: Color
* Description:接口类,定义方法
* @author HAND_WEILI
* @date 2018年9月8日
*/
public interface Color {
//实现上色的方法
public void getColor();
}
红色类(RedColor):实现于颜色类。
package bridgePattern;
public class RedColor implements Color {
@Override
public void getColor() {
// TODO Auto-generated method stub
System.out.println("红色的");
}
}
黑色类(BlackColor)
package bridgePattern;
public class BlackColor implements Color {
@Override
public void getColor() {
// TODO Auto-generated method stub
System.out.println("黑色的");
}
}
毛笔类(Pen):抽象类,将颜色类关联
package bridgePattern;
/**
*
* Title: Pen
* Description:毛笔类,首先要获取对应的color
* @author HAND_WEILI
* @date 2018年9月8日
*/
public abstract class Pen {
protected Color color;
//注入到实现类结构,设置颜色
public void setColor(Color color) {
this.color=color;
}
//抽象类画画
public abstract void paint();
}
小号毛笔(SmallPen):继承于毛笔类。
package bridgePattern;
public class SmallPen extends Pen{
@Override
public void paint() {
// TODO Auto-generated method stub
//调用Imp的颜色.
System.out.print("小号毛笔");
color.getColor();
}
}
大号毛笔(BigPen):继承于毛笔类,并同时,调用了color中的业务类。
package bridgePattern;
public class BigPen extends Pen {
@Override
public void paint() {
// TODO Auto-generated method stub
//调用Imp的颜色.
System.out.print("大号毛笔");
color.getColor();
}
}
配置文件
bridgePattern.RedColor
bridgePattern.SmallPen
XMUtiles():解析配置文件.
package builderPattern;
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.*;
import org.w3c.dom.NodeList;
public class XMLUtil {
public static Object getBean() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = null;
doc=db.parse(new File("src//builderPattern//config.xml"));
//获取包含类名的文本结点
NodeList list = doc.getElementsByTagName("className");
Node classNode = list.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通过类名生成实例对象并将其返回。
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
Client:测试客户端。
package bridgePattern;
public class Client {
public static void main(String[] args) {
Pen pen = (Pen) XMLUtils.getColor("pen");
Color color = (Color) XMLUtils.getColor("COLOR");
pen.setColor(color);
pen.paint();
}
}
结果:
优点:
缺点:
使用场景:
桥接模式在感觉就象是优化了抽象工厂模式,并且桥接模式可以和适配器模式搭配使用。这一块是非常好的一个扩展。在一个系统考虑类于类之间的关系的时候需要更加全面的考虑。因为复炸的系统是一个整体,缺一个点可能直接报错停止。你要是一个简单的系统,更本不需要考虑这么多。好比,一条蚯蚓,你切两半。OK我们变成两个还能获得好好的。但是你要是个人别说切两半,切掉你的五脏六腑你就歇菜。所以象这些模式,这些解决方案。就是为了解决更加复杂的问题而学习的。just for fun .
路漫漫其修远兮,吾将上下而求索!