`
duolaaqian
  • 浏览: 14428 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多

 

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

 

 

 

分享到:
评论

相关推荐

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。...无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的专业技能。

    研磨设计模式-part2

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式-part4

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式-part3

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书...综上所述,本书不仅是一本关于设计模式的入门书,也是对设计模式应用的深入探讨,无论是对于初级开发者、高级程序员,还是系统分析师,都能从中获得价值。

    java设计模式的 3本书 1 ppt

    这23种模式是根据GOF(GoF,Gang of Four)的经典著作《设计模式:可复用面向对象软件的基础》中的分类,包括创建型模式(如工厂模式、抽象工厂模式、单例模式等)、结构型模式(如适配器模式、桥接模式、装饰模式等...

    java开发设计模式

    对于不同级别的程序员,设计模式能够提供不同程度的帮助和指导,从初级程序员的基础编程技能提升,到高级程序员的系统设计和架构,再到系统分析师的项目问题解决,设计模式都能发挥关键作用。 在应用设计模式时,...

    java23种设计模式详细讲解

    设计模式是软件工程中解决常见问题的模板或通用解决方案,Java设计模式是这些解决方案在Java语言中的具体实现。《java23种设计模式详细讲解》这本书系统地介绍了23种设计模式,并通过具体的例子来阐释每种模式的应用...

    C/C++设计模式基础教程

    - **桥接模式**:将抽象部分与其实现部分分离,使得两者可以独立变化。 - **组合模式**:将对象组合成树形结构以表示“部分-整体”的层次结构。 - **外观模式**:为子系统中的一组接口提供一个一致的界面,简化子...

    研磨设计模式PDF

    桥接模式(Bridge)将抽象部分与实现部分分离,使它们可以独立变化;组合模式(Composite)将对象组合成树形结构,以表示“部分-整体”的层次结构;外观模式(Facade)为子系统提供一个统一的接口,使得子系统的复杂...

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 ...

    数据结构与设计模式电子书籍

    Design_Patterns-Elements_of_Reusable_Object-Oriented_Software.pdf"则是经典的《设计模式:可复用面向对象软件的基础》,通常简称为GOF设计模式,它介绍了23种经典设计模式,如命令模式、代理模式、桥接模式等,...

    Java中23种经典设计模式(附代码)

    对于一个Java初级工程师来说,掌握设计模式是提升到高级工程师的关键步骤,因为设计模式能提高代码的可读性、可维护性和可扩展性。 1. **创建型模式**: - **工厂方法**:定义一个用于创建对象的接口,让子类决定...

    24种设计模式

    在介绍24种设计模式之前,首先要明白设计模式的定义及其价值。设计模式是在软件工程领域中,针对特定问题的可复用解决方案的通称,它们是软件设计经验的总结,具有普遍适用性。掌握设计模式对于编写出结构清晰、易于...

    23种GoF设计模式Java版.pdf

    **11 桥接模式** - 将抽象部分与它的实现部分分离,使它们都可以独立变化。 **12 享元模式** - 运用共享技术有效地支持大量细粒度的对象。 **13 模板方法模式** - 定义一个操作中的算法骨架,而将一些步骤延迟到...

    设计模式与JAVA

    结构型模式处理对象组合和继承,例如适配器模式、桥接模式和装饰器模式,它们用于将不同类或接口组合在一起。行为型模式则关注对象间的行为分配,如观察者模式、责任链模式和策略模式,它们定义了对象之间的交互方式...

    CC++与设计模式基础课程_讲义

    - **初级开发人员**:需要培养批判性思维能力,不断思考和梳理现有设计模式,找到最佳实践。 - **中级开发人员**:在特定的开发环境中灵活选择和应用设计模式,通过实践不断提升自己的技术水平。 #### 五、设计模式...

Global site tag (gtag.js) - Google Analytics