声明:转载请附上原文链接
提示:标题序号从6开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之——适配器模式 序号从5开始。
6.桥接模式(了解)
6.1 桥接模式简介
-
桥接设计模式
- 适配器模式类似,包括以后经常会遇到意思接近⼀样的 设计模式,因为⼤神往往就是多个模式混⽤,且根据不 同的场景进⾏搭配,桥接设计模式也是结构型模式
- 将抽象部分与实现部分分离,使它们都可以独⽴的变化
- 通俗来说,是通过组合来桥接其它的⾏为/维度
-
应⽤场景
- 系统需要在构件的抽象化⻆⾊和具体化⻆⾊之间增加更 多的灵活性
- 不想使⽤继承导致系统类的个数急剧增加的系统
- 有时候⼀个类,可能会拥有多个变化维度,⽐如啤酒, 有不同的容量和品牌,可以使⽤继承组合的⽅式进⾏开 发,假如维度很多,就容易出现类的膨胀,使⽤桥接模 式就可以解决这个问题,且解耦
-
业务背景
我们需要构建⼀个⼿机类,我们知道⼿机有很多品牌,苹果、华
为等,从另外⼀个颜⾊维度,⼜有多种颜⾊,红、⻩、蓝等,
那如果描述这些类的话,传统⽅式就直接通过继承,就需要特别
多的类,品牌2,颜⾊3,就是6个类了,如果后续再增加品牌就
更多了,类数⽬将会激增,即所谓的类爆炸
使⽤桥接模式就可以解决这个问题,且灵活度⼤⼤提⾼
6.2 桥接设计模式案例
-
桥接模式优点
- 抽象和实现的分离
- 优秀的扩展能⼒,符合开闭原则
-
桥接模式缺点
- 增加系统的理解与设计难度
- 使⽤聚合关联关系建⽴在抽象层,要求开发者针对抽象 进⾏设计与编程,⽐如抽象类汽⻋,⾥⾯聚合了颜⾊ 类,有点像对象适配器
-
总结和对⽐
-
按GOF的说法,桥接模式和适配器模式⽤于设计的不同 阶段
- 桥接模式⽤于设计的前期,精细化的设计,让系统 更加灵活
- 适配器模式⽤于设计完成之后,发现类、接⼝之间 ⽆法⼀起⼯作,需要进⾏填坑
-
适配器模式经常⽤在第三⽅API协同⼯作的场合,在功能集成需求越来越多的今天,这种模式的使⽤频度越来 越⾼,包括有些同学听过 外观设计模式 ,这个也是某 些场景和适配器模式⼀样
-
就以手机这个为例子直接上代码:
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:07
* @Description: 抽象角色 手机
*/
public abstract class Phone {
/**
* 通过组合的方式来桥接其他行为(核心)
*/
protected Color color;
public void setColor(Color color) {
this.color = color;
}
/**
* 手机的方法
*/
abstract public void run();
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:08
* @Description: 手机颜色接口
*/
public interface Color {
void useColor();
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:38
* @Description:
*/
public class BlueColor implements Color {
@Override
public void useColor() {
System.out.println("蓝色...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:12
* @Description:
*/
public class RedColor implements Color {
@Override
public void useColor() {
System.out.println("红色...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:13
* @Description:
*/
public class YellowColor implements Color {
@Override
public void useColor() {
System.out.println("黄色...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:39
* @Description:
*/
public class HWPhone extends Phone {
public HWPhone(Color color) {
super.setColor(color);
}
@Override
public void run() {
color.useColor();
System.out.println("华为手机...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:40
* @Description: 手机的实例化
*/
public class ApplePhone extends Phone {
public ApplePhone(Color color) {
super.setColor(color);
}
@Override
public void run() {
color.useColor();
System.out.println("苹果手机...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/09/21:40
* @Description:
*/
public class SXPhone extends Phone {
public SXPhone(Color color) {
super.setColor(color);
}
@Override
public void run() {
color.useColor();
System.out.println("三星手机...");
}
}
调用测试:
@Test
public void testBridge() {
HWPhone hwPhone = new HWPhone(new BlueColor());
hwPhone.run();
ApplePhone applePhone = new ApplePhone(new RedColor());
applePhone.run();
}
输出结果:
蓝色...
华为手机...
红色...
苹果手机...
7. 组合设计模式(了解)
7.1 组合设计模式简介
-
组合设计模式
- ⼜叫部分整体模式,将对象组合成树形结构以表示“部 分-整体”的层次结构,可以更好的实现管理操作
- 组合模式使得⽤户可以使⽤⼀致的⽅法操作单个对象和 组合对象
- 部分-整体对象的基本操作多数是⼀样的,但是应该还 会有不⼀样的地⽅
- 核⼼:组合模式可以使⽤⼀棵树来表示
-
应⽤场景
- 银⾏总⾏,总⾏有前台、后勤、⽹络部⻔等,辖区下还 有地⽅分⾏,也有前台、后勤、⽹络部⻔,最⼩的分⾏ 就没有⼦分⾏了
- 公司也是,总公司下有⼦公司,每个公司⼤部分的部⻔ 都类似
- ⽂件夹和⽂件,都有增加、删除等api,也有层级管理 关系
- 当想表达对象的部分-整体的层次结构
- 当我们的要处理的对象可以⽣成⼀颗树形结构,我们要 对树上的节点和叶⼦进⾏操作时,它能够提供⼀致的⽅ 式,⽽不⽤考虑它是节点还是叶⼦
-
⻆⾊
- 组合部件(Component):它是⼀个抽象接⼝,表示 树根,例⼦:总⾏
- 合成部件(Composite):和组合部件类似,也有⾃⼰ 的⼦节点,例⼦:总⾏下的分⾏
- 叶⼦(Leaf):在组合中表示⼦节点对象,注意是没有 ⼦节点,例⼦:最⼩地⽅的分⾏
组合设计模式实际上用的比较少,就不再花文章讲述,给大家推荐一篇文章自行了解:JAVA设计模式——组合模式
之后我会陆续更新其他设计模式博文,如果文章对您有帮助,希望点个赞/收藏/关注! O(∩_∩)O~