/** * 桥接模式 * 解决多维度可变属性造成的多类问题 * (用到了组合,但与 组合模式 没关系) * * 场景: * 各大品牌生产电子产品 * 品牌:联想、戴尔、苹果 * 产品:台式机、笔记本、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 "夏普"; } }