[初级]设计模式--桥接模式

 

/**
 * 桥接模式
 * 	解决多维度可变属性造成的多类问题
 * 	(用到了组合,但与 组合模式 没关系)
 * 
 * 场景:
 * 	各大品牌生产电子产品
 * 	品牌:联想、戴尔、苹果
 * 	产品:台式机、笔记本、pad
 * 
 * 如果采用继承的方式实现类结构,那类的数量则是一个乘积的关系
 * (联想、戴尔、苹果)*(台式机、笔记本、pad)
 * 这样会产生一些问题:
 * 	1、产生大量的类,类之间还会有重复的功能(冗余)
 * 	2、品牌 和 类型 之间是有关系的(没有解耦)
 * 	3、添加其中一个实现,则需要添加一定数量的另一个(不好维护)
 * 
 * 如果采用桥接的方式,那类的数量则只是一个相加关系
 * (联想、戴尔、苹果)+(台式机、笔记本、pad)
 * 优点:
 * 	1、大大减少了类的数量
 * 	2、解除了类之间的耦合关系,增加了复用性和可维护性
 */
public class BridgeDemo01 {
	public static void main(String[] args) {
		List<Computer> l = new ArrayList<Computer>();
		l.add(new Desktop(new Dell()));
		l.add(new Desktop(new Lenovo()));
		l.add(new Desktop(new Apple()));
		l.add(new Laptop(new Dell()));
		l.add(new Laptop(new Lenovo()));
		l.add(new Laptop(new Apple()));
		l.add(new Pad(new Dell()));
		l.add(new Pad(new Lenovo()));
		l.add(new Pad(new Apple()));
		for(Computer c : l){
			c.sale();
		}
	}
}
/**
 * 电脑抽象类
 */
abstract class Computer{
	private Brand brand;
	public Computer(Brand brand){
		this.brand = brand;
	}
	abstract String getType();
	public void sale(){
		System.out.println("销售["+brand.getName()+"]牌的"+"["+getType()+"]");
	}
}
/**
 * 品牌接口
 */
interface Brand{
	String getName();
}

/**
 * 电脑具体实现类
 */
class Desktop extends Computer{
	public Desktop(Brand brand) {
		super(brand);
	}
	@Override
	String getType() {
		return "台式机";
	}
}
class Laptop extends Computer{
	public Laptop(Brand brand) {
		super(brand);
	}
	@Override
	String getType() {
		return "笔记本电脑";
	}
}
class Pad extends Computer{
	public Pad(Brand brand) {
		super(brand);
	}
	@Override
	String getType() {
		return "平板电脑";
	}
}
/**
 * 品牌具体实现类
 */
class Dell implements Brand{
	@Override
	public String getName() {
		return "戴尔";
	}
}
class Lenovo implements Brand{
	@Override
	public String getName() {
		return "联想";
	}
}
class Apple implements Brand{
	@Override
	public String getName() {
		return "苹果";
	}
}

输出结果:

销售[戴尔]牌的[台式机]
销售[联想]牌的[台式机]
销售[苹果]牌的[台式机]
销售[戴尔]牌的[笔记本电脑]
销售[联想]牌的[笔记本电脑]
销售[苹果]牌的[笔记本电脑]
销售[戴尔]牌的[平板电脑]
销售[联想]牌的[平板电脑]
销售[苹果]牌的[平板电脑]
  

 

/**
 * IPhone6s一共有16种版本
 * 
 *  1、三星14nm+海力士MLC+LG+三星
 *  2、三星14nm+海力士MLC+LG+海力士
 *  3、三星14nm+海力士MLC+夏普+三星
 *  4、三星14nm+海力士MLC+夏普+海力士
 *  5、三星14nm+东芝TLC+LG+三星
 *  6、三星14nm+东芝TLC+LG+海力士
 *  7、三星14nm+东芝TLC+夏普+三星
 *  8、三星14nm+东芝TLC+夏普+海力士
 *  9、台积电16nm+海力士MLC+LG+三星
 *  10、台积电16nm+海力士MLC+LG+海力士
 *  11、台积电16nm+海力士MLC+夏普+三星
 *  12、台积电16nm+海力士MLC+夏普+海力士
 *  13、台积电16nm+东芝TLC+LG+三星
 *  14、台积电16nm+东芝TLC+LG+海力士
 *  15、台积电16nm+东芝TLC+夏普+三星
 *  16、台积电16nm+东芝TLC+夏普+海力士
 *  
 * 如果使用继承或每一种IPhone6s定义一个类,则需要定义16个类
 * (而且每个品牌都生产4中配件的话,则类会更多)
 * 使用桥接模式我们只需要定义10(4组件+6配置)个类
 * 看似差的不多(6个而已),好的,我们还有4种不同的颜色
 * 	16*4=64
 * 	16+4=20
 */
public class BridgeDemo02 {
	public static void main(String[] args) {
		TechBrand samsung = new Samsung();
		TechBrand tsmc = new TSMC();
		TechBrand hynix = new Hynix();
		TechBrand toshiba = new Toshiba();
		TechBrand lg = new LG();
		TechBrand sharp = new Sharp();
		
		List<IPhone6s> l = new ArrayList<IPhone6s>(16);
		l.add(new IPhone6s(new CPU(samsung),new Flash(hynix),new Screen(lg),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(hynix),new Screen(lg),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(hynix),new Screen(sharp),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(hynix),new Screen(sharp),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(toshiba),new Screen(lg),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(toshiba),new Screen(lg),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(toshiba),new Screen(sharp),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(samsung),new Flash(toshiba),new Screen(sharp),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(hynix),new Screen(lg),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(hynix),new Screen(lg),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(hynix),new Screen(sharp),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(hynix),new Screen(sharp),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(toshiba),new Screen(lg),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(toshiba),new Screen(lg),new RAM(hynix)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(toshiba),new Screen(sharp),new RAM(samsung)));
		l.add(new IPhone6s(new CPU(tsmc),new Flash(toshiba),new Screen(sharp),new RAM(hynix)));
		
		for(IPhone6s p : l){
			System.out.println("配置:"+p.getInfo());	
		}
		System.out.println("*************************************************");
		System.out.println("您购买的IPhone6s配置为:" + l.get(new Random().nextInt(16)).getInfo());
	}
}
class IPhone6s{
	private String info;
	public IPhone6s(CPU cpu, Flash flash, Screen screen, RAM ram){
		this.info = cpu.getName()+" + "+flash.getName()+" + "+ screen.getName()+" + "+ram.getName();
	}
	public String getInfo(){
		return info;
	}
}
/**
 * 配件
 */
abstract class Component{
	TechBrand tb;
	public Component(TechBrand tb){
		this.tb = tb;
	}
	public abstract String getType();
	public String getName(){
		return tb.getName()+"的"+getType();
	}
}
/**
 * 品牌
 */
interface TechBrand{
	String getName();
}

/**
 * 配件具体实现类
 */
class CPU extends Component{
	public CPU(TechBrand tb) {
		super(tb);
	}
	public String getType(){
		return "CPU";
	}
}
class Flash extends Component{
	public Flash(TechBrand tb) {
		super(tb);
	}
	public String getType(){
		return "闪存";
	}
}
class Screen extends Component{
	public Screen(TechBrand tb) {
		super(tb);
	}
	public String getType(){
		return "屏幕";
	}
}
class RAM extends Component{
	public RAM(TechBrand tb) {
		super(tb);
	}
	public String getType(){
		return "内存";
	}
}
/**
 * 品牌具体实现类
 */
class Samsung implements TechBrand{
	@Override
	public String getName() {
		return "三星";
	}
}
class TSMC implements TechBrand{
	@Override
	public String getName() {
		return "台积电";
	}
}
class Hynix implements TechBrand{
	@Override
	public String getName() {
		return "海力士";
	}
}
class Toshiba implements TechBrand{
	@Override
	public String getName() {
		return "东芝";
	}
}
class LG implements TechBrand{
	@Override
	public String getName() {
		return "LG";
	}
}
class Sharp implements TechBrand{
	@Override
	public String getName() {
		return "夏普";
	}
}

输出结果:

配置:三星的CPU + 海力士的闪存 + LG的屏幕 + 三星的内存
配置:三星的CPU + 海力士的闪存 + LG的屏幕 + 海力士的内存
配置:三星的CPU + 海力士的闪存 + 夏普的屏幕 + 三星的内存
配置:三星的CPU + 海力士的闪存 + 夏普的屏幕 + 海力士的内存
配置:三星的CPU + 东芝的闪存 + LG的屏幕 + 三星的内存
配置:三星的CPU + 东芝的闪存 + LG的屏幕 + 海力士的内存
配置:三星的CPU + 东芝的闪存 + 夏普的屏幕 + 三星的内存
配置:三星的CPU + 东芝的闪存 + 夏普的屏幕 + 海力士的内存
配置:台积电的CPU + 海力士的闪存 + LG的屏幕 + 三星的内存
配置:台积电的CPU + 海力士的闪存 + LG的屏幕 + 海力士的内存
配置:台积电的CPU + 海力士的闪存 + 夏普的屏幕 + 三星的内存
配置:台积电的CPU + 海力士的闪存 + 夏普的屏幕 + 海力士的内存
配置:台积电的CPU + 东芝的闪存 + LG的屏幕 + 三星的内存
配置:台积电的CPU + 东芝的闪存 + LG的屏幕 + 海力士的内存
配置:台积电的CPU + 东芝的闪存 + 夏普的屏幕 + 三星的内存
配置:台积电的CPU + 东芝的闪存 + 夏普的屏幕 + 海力士的内存
*************************************************
您购买的IPhone6s配置为:三星的CPU + 东芝的闪存 + 夏普的屏幕 + 海力士的内存

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值