设计模式之桥接模式

原博主地址:(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值