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