JAVA桥接模式

JAVA桥接模式

 

通过本文将学习到

1、前言

2、桥接模式的概念

3、桥接模式的UML图

4、桥接模式的实现

5、桥接模式的优缺点及使用环境

6、总结      


1、前言

今天上了一个大佬的课,在聊大学学的东西。数据结构、编译原理、软件工程、算法导论、离散数学、....这些,从30年前大学开启计算机这门学科开始就没怎么变过。换句话说这些东西是内功想以后走的远,内功不高,怕是成就一般哦!并且基础的东西也就那么多!并不是不可以掌握的,这个是我接下来两年需要需要关注的一个点,理论和实践!通过两年时间将这一块弄熟!

接着大佬又聊到了,第一份工作。我的想法是去小公司,因为可以做很多东西,熟悉工具。但是大佬却不一样的看法,一个人的眼界觉得自己的成就高低。通过在大公司规范的模式,能够让自己少走很多弯路。我突然觉得这个观点也很对,因为我只想着自己学到技术,然后自己帮人做网站,但是没考虑到当人数变多时如何管理!想做大做强,有个现成的模仿是最快的了!去学习别人的管理模式,别人的运营模式。

最后,我说2年以后要自己做工作室!因为,我看到一些学长毕业两年就自己做了的公司。但是,我没思考过的是别人大学是怎么过的,别人在大学的时候,就已经开始在软件这个行业开始准备了。实际上别人已经做了很多年的准备!我,一没技术,二没资源。如果成立了,除了倒闭我想不到有任何出路!但是,我不可能因为自己不会,没准备就不干了啊!自己做自己的主这才是出路啊!所以,我要制定一系列的计划。从技术方面、资金方面、销售方面、管理方面。每一个点都需要做出准备。不然,我就只可能是个炮灰而已!一个初出茅庐的小伙子,无论怎么看,别人都觉得不靠谱!且,不可以放弃,这个点很重要。只有将财务自由,才能够更好的主宰自己的命运。

桥接模式是一种结构型模式,如果系统中的某个类存在俩个独立的维度,通过桥接模式可以将这两个维度分离出来,使两者可以独立扩展。

2、桥接模式的概念

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立扩展!

 在学习设计模式之前我们要明确一点,我们不是闲着无聊敲敲代码而已!而是,有具体的需要,解决问题。使问题更加容易解决!

桥接模式是为了将对象的不同属性进行分离,既是解耦的过程。举个栗子:蜡笔和毛笔大家在生活中有见到过。蜡笔有颜色和型号之分。而毛笔只有幸好之分,颜色是用啥颜色就是啥色。比如:我需要大、中、小三种类型的蜡笔,颜色都是7种那么。我们需要为每一种蜡笔创建每一个不同的颜色的类。3*7=21只蜡笔!但是如果用毛笔的话,我就只要3种类型的毛笔,外加7种颜色,想要啥颜色的就直接用毛笔蘸墨水。3+7=10。可以看出明显减少了类的创建!减少了复杂度。并且,假设以后要添加型号,那么毛笔只要加一个不同的型号类,而蜡笔,需要为这个型号类加上7只不同颜色的笔。综上所述:蜡笔之所以会出现这种原因是因为,将颜色和型号给绑定在一起了。我们需要干的就是将其分离。然两个维度各自单独扩展!

画笔的型号与颜色可以看成是两个不同的维度。

画个图好理解。

JAVA桥接模式_第1张图片因此我们的任务就是将两个关联在一的属性,耦合在一起的属性进行解耦。做成毛笔类型。

3、桥接模式的UML图

JAVA桥接模式_第2张图片

Abstraction(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以为维护对象,就是将两个接口进行关联。既可以包含抽象业务,也可以包含具体业务。

RefinedAbstraction(扩充抽象类):它扩充由Abstraction定义的接口,通常情况下它不再是抽像类而是具体的类。实现了在Abstraction中定义的抽象方法,在其也能掉哦那个implementor.的业务方法。

Implmentor(实现类接口):它是定义实现类的接口,就是颜色类型。给它上色。

ConcreteImplmentor(具体实现类):具体实现抽象类的业务。

4、桥接模式的实现

JAVA桥接模式_第3张图片

来个实例呗 。

颜色接口(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();
	}

}

结果:

JAVA桥接模式_第4张图片

5、桥接模式的优缺点及使用环境

优点:

  1. 很明显,通过将类的职责细分。然后使用桥接模式组合在一起可以看到类的数量急剧的减少。实现的对象见的关联关系,来达到抽象和实现之间的解耦。使得抽象和实现可以按着自己的维度进行扩展。
  2. 在大多数情况下,桥接模式可以取代多继承的方案,因为多继承违背了单一职责的设计原则。难以复用和维护。
  3. 桥接模式提高了系统的可扩展性,在两个维度之间都可以自主扩展而不影响原系统。

缺点:

  1. 桥接模式虽然好用但是,会提升系统的理解难度和设计难度,由于关联关系在抽象层,要求设计者一开始就针对抽象层进行设计和编程。
  2. 还有他需要两个维度,这个东西很难懂。得需要大量实践。

使用场景:

  • 一个类有两个独立得维度,或者以上。并且需要各自对立的扩展!
  • 、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免两个层次建立静态联系,可以通过桥接模式是他们得抽象层建立一层关联联系。

6、总结

桥接模式在感觉就象是优化了抽象工厂模式,并且桥接模式可以和适配器模式搭配使用。这一块是非常好的一个扩展。在一个系统考虑类于类之间的关系的时候需要更加全面的考虑。因为复炸的系统是一个整体,缺一个点可能直接报错停止。你要是一个简单的系统,更本不需要考虑这么多。好比,一条蚯蚓,你切两半。OK我们变成两个还能获得好好的。但是你要是个人别说切两半,切掉你的五脏六腑你就歇菜。所以象这些模式,这些解决方案。就是为了解决更加复杂的问题而学习的。just for fun .

路漫漫其修远兮,吾将上下而求索!

 

你可能感兴趣的:(技术总结学习,设计模式)