建造者模式

我理解的就是零件的装配,用在需要把一些有联系的属性拼接起来。

如StringBuilder就是很典型的。

引入一个场景,去药房抓中药,有以下组成:

1、药品  (抽象零件)

2、天麻、枸积、何首乌(具体零件)

3、Builder组装接口  (抽象组装)

4、Builder 组装实现类

// 抽象零件
public interface Medicine {String getName();double getPrise();String getDesc();
}// 具体零件
public class GouJi implements Medicine {@Overridepublic String getName() {return "枸积";}@Overridepublic double getPrise() {return 20;}@Overridepublic String getDesc() {return "宁夏五宝之首";}
}public class HeShouWu implements Medicine {@Overridepublic String getName() {return "何首乌";}@Overridepublic double getPrise() {return 35;}@Overridepublic String getDesc() {return "黑头发的何首乌";}
}public class TianMa implements Medicine {@Overridepublic String getName() {return "天麻";}@Overridepublic double getPrise() {return 124;}@Overridepublic String getDesc() {return "治头痛的天麻";}
}// 抽象组装接口
public interface MedicineOps {MedicineOps addGouji();MedicineOps addHeShouWu();MedicineOps addTianMa();String getDetails();
}// 具体组装类
public class Diagnosis implements MedicineOps{private List<Medicine> medicines = new ArrayList<>();private Double price;private String yisheng;private String bingQing;public Diagnosis(String bing, String yisheng){this.bingQing = bing;this.yisheng = yisheng;price = 0d;}@Overridepublic MedicineOps addGouji() {GouJi gouJi = new GouJi();medicines.add(gouJi);this.price += gouJi.getPrise();return this;}@Overridepublic MedicineOps addHeShouWu() {HeShouWu heShouWu = new HeShouWu();medicines.add(heShouWu);this.price += heShouWu.getPrise();return this;}@Overridepublic MedicineOps addTianMa() {TianMa tianMa = new TianMa();medicines.add(tianMa);this.price += tianMa.getPrise();return this;}@Overridepublic String getDetails() {StringBuilder sb = new StringBuilder();sb.append("主治医师:").append(yisheng).append("\n病情:").append(bingQing).append("\n所用中药有:\n");for (Medicine medicine : medicines) {sb.append(medicine.getName()).append(" : ").append(medicine.getDesc()).append("\n");}sb.append("总共价格为:").append(price);return sb.toString();}}// 调用
public class Builder {public MedicineOps getA() {return new Diagnosis("脑壳痛", "刘德光大夫").addGouji().addHeShouWu().addTianMa();}public static void main(String[] args) {System.out.println(new Builder().getA().getDetails());}
}// 结果
/*
主治医师:刘德光大夫
病情:脑壳痛
所用中药有:
枸积 : 宁夏五宝之首
何首乌 : 黑头发的何首乌
天麻 : 治头痛的天麻
总共价格为:179.0*/

可以看到调用的时候类似于StingBuilder,需要啥零件,就调用啥方法,以此组成不同的套餐。

使用场景:

基本物料不会变,但是其组合经常改变的时候。

桥接模式

比如咱有两个杯子:大杯子和小杯子,有三种饮料:可乐、橙汁、白开水。如果现在的场景是我要用杯子去喝饮料,那他们的组合会有2*3种,代表着咱得ifelseifelse.....

而桥接模式就可以让咱的这种尴尬代码得救

杯子和饮料都是单独变化的两个维度,并且不会互相影响,那咱就给它分别抽出来处理。

代码具有以下组成部分:

1、抽象类BeiZi,里面有一个饮料对象。

2、杯子的实现类

3、饮料接口

4、饮料实现类

在new 杯子的时候,将需要的饮料对象注入,达成匹配效果。

// 杯子抽象类
public abstract class BeiZi {Beverages beverages;public BeiZi(Beverages beverages) {this.beverages = beverages;}public abstract void drick();
}// 杯子实现类
public class BigBeiZi extends BeiZi {public BigBeiZi(Beverages beverages){super(beverages);}@Overridepublic void drick() {System.out.println("我用大杯子喝"+beverages.witchBev());}
}public class SmallBeiZi extends BeiZi {public SmallBeiZi(Beverages beverages) {super(beverages);}@Overridepublic void drick() {System.out.println("我正在用超可爱的小杯子喝"+beverages.witchBev());}
}//饮料接口
public interface Beverages {String witchBev();
}//饮料实现类
public class Cha implements Beverages {@Overridepublic String witchBev() {return "茶";}
}public class Colo implements Beverages{@Overridepublic String witchBev() {return "可乐";}
}// 测试
public class TestQIaoJie {public static void main(String[] args) {BigBeiZi bigBeiZi = new BigBeiZi(new Colo());bigBeiZi.drick();BigBeiZi bigBeiZi1 = new BigBeiZi(new Cha());bigBeiZi1.drick();SmallBeiZi smallBeiZi = new SmallBeiZi(new Colo());smallBeiZi.drick();}
}// 结果
我用大杯子喝可乐
我用大杯子喝茶
我正在用超可爱的小杯子喝可乐

桥接模式的精髓就在于,分离出来的两个维度可以自由扩展哦!

如果按之前的ifelse来写,那么万一增加了一种饮料,那咱就得去业务代码种增加一个else了,违背了开闭原则。

建造者模式和桥接模式,答应我告别ifelse好吗?相关推荐

  1. VMware虚拟网络设置(NAT模式,桥接模式,仅主机模式设置),再也不用担心虚拟机连不上网了。

    前言: 在使用VMware安装Linux之前需要配置网络相关设置,不然安装成功了也无法联网,VMware 给我们提供了3种模式,NAT模式,桥接模式,仅主机模式.接下来就是怎么设置这些网络. 1.VM ...

  2. 虚拟机网络连接模式中桥接模式和NAT模式的区别

    1.桥接模式:当虚拟机系统的网络连接模式为桥接模式时,相当于在主机系统和虚拟机系统之间连接了一个网桥,而网桥两端的网络都属于同一网络,主机和虚拟机是处于同一网络中的对等主机. 实例,在使用Xshell ...

  3. OpenWrt的两种模式:桥接模式与路由模式

    OpenWrt的两种模式:桥接模式与路由模式 1.桥接模式(Bridged AP Mode ): 通过OpenWrt 设备做桥,连接到OpenWrt的无线设备是由此网段192.168.1.0网段中的路 ...

  4. 装饰者模式---装饰者模式和桥接模式的区别

    装饰者模式: 什么是装饰者模式:动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式又称为包装模式,它主要是为了扩展对象的功能,包装类通过持有对象的引用(将对象传到 ...

  5. 转:中国移动宽带光猫F663路由模式改桥接模式

    转:中国移动光猫F623路由模式改桥接模式(拨号模式) 添加时间:2017-12-1  来源:http://www.637641.com/news.asp?id=285 注意:大家一定要记住自己的vl ...

  6. 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

    目录 一.组合模式 1. 什么是组合模式 2. 组合模式案例 二.桥接模式 1. 什么是桥接模式 2. 桥接模式案例 一.组合模式 1. 什么是组合模式 Composite Pattern,组合模式, ...

  7. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  8. 【虚拟机NAT模式及桥接模式配置】

    VMware虚拟机网络配置 虚拟机常见的网络类型 NAT(网络地址转换) Bridged(桥接模式) Host-Only(仅主机) 虚拟机网络配置 配置为NAT模式 配置为桥接模式 虚拟机常见的网络类 ...

  9. 虚拟机的三种可选模式:桥接模式、NAT模式、主机模式浅析

    一.问题场景 在配置虚拟机的时候,往往有三种可供选择的网络模式:桥接模式.NAT模式.主机模式浅析.查阅了有关的资料,在下面对这三种模式做一下区分. 二.区别 假设在网段为 192.168.100.x ...

  10. 结构型模式之桥接模式的案例示范

    1. 桥接模式介绍 桥接模式的主要作用就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合.说白了核心实现就是A类中含有B类接口,通过构造函数传递B类的实现,这个B类就是设计的桥. 桥接模式在 ...

最新文章

  1. 19_05_01校内训练[划分]
  2. SharePoint Online 创建和使用栏
  3. Redis未授权访问写Webshell和公私钥认证获取root权限
  4. 带收缩因子的PSO优化算法
  5. cmstop框架中的js设计content.js
  6. macaca使用中问题解决方法整理
  7. 孙长凯sunck_傅里叶变换红外光谱分析NMDA受体单克隆抗体抗-中国科技论文在线.PDF...
  8. 嵌入式Linux系统编程学习之二常用命令
  9. webpack+vue解决前端跨域问题
  10. 《剑指offer》面试题60——把二叉树打印成多行(C++)
  11. c语言函数调用用法大全,C语言函数
  12. http下载大文件测试
  13. Phaser帧动画没有效果
  14. 机器人运动规划技术介绍
  15. 目前为止学习过的循环解析过程
  16. 常用Linux命令及其作用(超详细,带演示)
  17. 算法工程师-机器学习-数据科学家面试准备[外企和国外公司、春招、秋招]
  18. 12.3 call_soon、call_at、call_later、call_soon_threadsafe
  19. 基于PHP的视频社交管理系统
  20. 基于FPGA的DDS参考设计

热门文章

  1. Oracle之TO_DATE用法详解
  2. 微信小程序使用iconfont字体图标
  3. 删除mysql中的函数
  4. mysql数据库物理结构_MySQL数据库结构设计(物理设计)
  5. DLX精确覆盖 hdu4069 Squiggly Sudoku
  6. 教你一招:复制不能复制的网页文字(通用篇)
  7. 物联网中射频技术的应用
  8. Excel表格密码保护解除
  9. SQL如何修改表中的结构
  10. Codeforces Round #495 (Div. 2) D. Sonya and Matrix[思维构造]