原博主地址:(https://blog.csdn.net/LoveLion/article/details/17517213)
桥接模式:就是把两个功能单独开来,比如节目要在电视台播出,选中电视台才能选节目,如果按原来,要准备n*m个方法,但是现在只有准备n个电视台和m个节目就行,具体怎么播出自由搭配。
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
先准备一些电视台,电视台可以设置表演节目,也可以播出节目。
package test2019.mon01.桥接模式.tv;
import test2019.mon01.桥接模式.show.Show;
/**
* Filename: TV.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:41:08
*/
public abstract class TV {
protected Show show;
public void setShow(Show show) {
this.show = show;
}
public abstract void bochu();
}
package test2019.mon01.桥接模式.tv;
/**
* Filename: CCTV.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:41:30
*/
public class CCTV extends TV {
@Override
public void bochu() {
System.out.println("CCTV播出");
show.showShow();
}
}
package test2019.mon01.桥接模式.tv;
/**
* Filename: CCTV.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:41:30
*/
public class JSTV extends TV {
@Override
public void bochu() {
System.out.println("江苏TV播出");
show.showShow();
}
}
package test2019.mon01.桥接模式.tv;
/**
* Filename: CCTV.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:41:30
*/
public class ZJTV extends TV {
@Override
public void bochu() {
System.out.println("浙江TV播出");
show.showShow();
}
}
再准备一些节目来表演
package test2019.mon01.桥接模式.show;
/**
* Filename: Show.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:42:15
*/
public interface Show {
public void showShow();
}
package test2019.mon01.桥接模式.show;
/**
* Filename: MagicShow.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:44:28
*/
public class MagicShow implements Show {
@Override
public void showShow() {
System.out.println("表演magicshow");
}
}
package test2019.mon01.桥接模式.show;
/**
* Filename: TalkShow.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:42:56
*/
public class TalkShow implements Show{
@Override
public void showShow() {
System.out.println("表演talkshow!");
}
}
用读取配置的方式选择具体的电视和节目
<?xml version="1.0"?>
<config>
<!--RefinedAbstraction-->
<className>test2019.mon01.桥接模式.tv.JSTV</className>
<!--ConcreteImplementor-->
<className>test2019.mon01.桥接模式.show.MagicShow</className>
</config>
package test2019.mon01.桥接模式;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Filename: XmlUtil.java Description: Company: sendinfo.com.cn Inc.
*
* @author: guzhangyan
* @date: 2019年1月23日 上午10:59:36
*/
public class XmlUtil {
public static Object getBean(String name) {
try {
// 创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src\\test2019\\mon01\\桥接模式\\config.xml"));
NodeList nl = null;
Node classNode = null;
String cName = null;
nl = doc.getElementsByTagName("className");
if (name.equals("TV")) {
// 获取第一个包含类名的节点,即扩充抽象类
classNode = nl.item(0).getFirstChild();
} else if (name.equals("SHOW")) {
// 获取第二个包含类名的节点,即具体实现类
classNode = nl.item(1).getFirstChild();
}
cName = classNode.getNodeValue();
// 通过类名生成实例对象并将其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
主方法
package test2019.mon01.桥接模式;
import test2019.mon01.桥接模式.show.Show;
import test2019.mon01.桥接模式.tv.TV;
/**
* Filename: Test.java
* Description:
* Company: sendinfo.com.cn Inc.
* @author: guzhangyan
* @date: 2019年1月23日 上午10:58:35
*/
public class Test {
public static void main(String[] args) {
Show show = (Show)XmlUtil.getBean("SHOW");
TV tv = (TV)XmlUtil.getBean("TV");//选择要看的台
tv.setShow(show);//电视调节目
tv.bochu();//播放
}
}
结果
江苏TV播出
表演magicshow