桥接模式

设计模式---桥接模式

廉价感情. 提交于 2019-11-30 06:00:57
问题场景: 现在的手机有很多不同的品牌,样式也各种各样,什么水滴屏,刘海屏,挖孔屏,什么华为,vivo,小米等等。如果我们基于继承关系来设计的话,你就会发现这个时候有点无从下手了。 当然这个图的设计是不合理的,你也可以试着将不同的屏再抽象下,但是发现还是不是很合理,而且即使实现了要扩展的话很是麻烦。这个时候我们就可以引入桥接模式。 桥接模式的主要特点就是把抽象化与行为实现解耦,使得二者可以独立变化。 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活,就像上述场景,手机厂家有多个,手机屏幕也是多元化的。 比如上诉问题,我们这样来设计 打电话的行为提取一个接口出来,手机提取一个抽象出来,在抽象(Phone)里面去聚合行为(Brand),这个过程就像搭了个桥把抽象与行为连接起来。当然这样也把抽象和行为分离开来了,可以独立扩展,如果我要新增一个折叠屏的,只需要在抽象这边加一个类就OK,如果需要扩展手机品牌,只需要在接口实现那边加个小米就可以了,二者可以独立变化,提高系统的灵活性 。 行为侧: 接口: package com.nijunyang.designpatterns.bridge.api; /** * @author: create by nijunyang * @date:2019/9/22 */ public interface Brand { void

设计模式课程 设计模式精讲 15-1 桥接模式讲解

走远了吗. 提交于 2019-11-29 16:23:34
1    桥接模式讲解 1.1  类型: 1.2  定义: 1.3  适用场景: 1.4  优点: 1.5  缺点: 1.6  与其他设计模式关系: 1    桥接模式讲解 1.1  类型: 结构型 1.2  定义: ◆定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化 ◆合成复用原则中提到:优先通过组合的方式建立两个类之间联系,而不是继承,继承过多会发生类爆炸的情况 1.3  适用场景: ◆a  抽象和具体实现之间增加更多的灵活性 适用桥接模式可以避免两个层次之间建立静态的继承关系,通过桥接模式使他们之间建立一种关联关系 , 抽象部分和具体实现部分它们都可以通过继承的方式独立的扩展,并且互不影响,就可以动态的将一个抽象化子类的对象和一个实现化的子类对象,进行组合。 这样我们抽象化的角色和实现化的对象就实现了解耦 ◆b  一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展 ◆c  不希望使用继承,或因为多层继承导致系统类的个数剧增 1.4  优点: ◆a  分离抽象部分及其具体实现部分 桥接模式使用了组合,也就是说 使用对象与对象之间的关系,来解耦了抽象和实现之间的固有的绑定关系,使抽象和实现可以沿着各自的维度去变化来扩展。 抽象和实现不再在一个继承的层次中,从而通过组合获得多维度的组合对象 ◆b  提高了系统的可扩展性

初学设计模式之桥接模式

笑着哭i 提交于 2019-11-29 13:18:15
初学设计模式之桥接模式 1、什么是桥接模式 官方解答:将抽象部分与实现部分分离,使它们都独立的变化 2、先感性的认识一下桥接模式 一看这么官方的解释,这车速,有点晕车,没关系,开车之前前咱们先骑自行车感受一下慢速行驶。 假如有一道常识题希望答题人输出的正确 答案为:居里夫人是化学家(干扰因素有雨果、生物学家) 选择题:A 居里夫人是化学家 B 居里夫人是生物学家、 C 雨果是化学家 D 雨果是生物学家 连线题:(人名) 是 (头衔) 居里夫人 化学家 雨果 生物学家 如果你是出题人你会选择哪种形式?假如现在又加入了干扰因素贝多芬,另外又加了一个出题的干扰维度国籍:波兰,中国。 很显然,出题人为了方便,会选择连线题的方式,首先连线题重复字数较少,而且,如果增加出题的干扰因素,选择题还需要重新排列选项,工作量很大,连线题只需要再增加一个属性维度或者在属性下面再增加一个内容即可,纵向横向可以随意扩展。桥接模式就相当于连线题,把属性桥接到一串,也就是把抽象类桥接到一起。这样的话抽象类里面继承的具体子类可以随意扩展,再拓展多个其他抽象类也完全可以, 实现抽象部分与实现部分分离 ,方便编写、调试和维护。 3、一起来看一个编程需求 首先读一句熟悉的话: 老师 用 粉笔 写字 我们把老师看做一个对象,那么它属于职业类,既然它是类那么它就还会有其他对象,比如工程师等;粉笔看成一个对象

vmware centos 桥接和NAT的IP配置

大憨熊 提交于 2019-11-29 06:32:38
先初始化VM, 桥接模式: [root@out network-scripts]# cat ifcfg-ens33 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=no IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=b4a417df-1494-4e18-9aee-8b257c1e529e DEVICE=ens33 ONBOOT=yes IPADDR=192.168.1.189 NETMASK=255.255.255.0 GETWAY=192.168.1.1 DNS1=114.114.114.114 [root@out network-scripts]# pwd /etc/sysconfig/network-scripts NAT方式: [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE

使用桥接模式来显示下单结果

三世轮回 提交于 2019-11-29 06:13:46
在用工厂方法模式来下不同订单 中我们看到,我们只简单显示来一个“下单成功”,但实际上我们需要给用户返回到结果可能多种多样。 先增加一个订单结果到接口。 public interface OrderSuccessResult { public OrderSuccessResult getResult(Order order); } 添加一个服务订单结果实现类 @Data @AllArgsConstructor @NoArgsConstructor @Builder public class ServiceOrderSuccessResult implements OrderSuccessResult { private String content; private String storeName; private String orderCode; private String servicContent; private Date serviceDate; private String storeAddress; private BigDecimal serviceAmount; @Override public OrderSuccessResult getResult(Order order) { ServiceOrderSuccessResult

使用桥接模式来显示下单结果

做~自己de王妃 提交于 2019-11-29 04:46:02
在 用工厂方法模式来下不同订单 中我们看到,我们只简单显示来一个“下单成功”,但实际上我们需要给用户返回到结果可能多种多样。 先增加一个订单结果到接口。 public interface OrderSuccessResult { public OrderSuccessResult getResult (Order order) ; } 添加一个服务订单结果实现类 @Data @AllArgsConstructor @NoArgsConstructor @Builder public class ServiceOrderSuccessResult implements OrderSuccessResult { private String content ; private String storeName ; private String orderCode ; private String servicContent ; private Date serviceDate ; private String storeAddress ; private BigDecimal serviceAmount ; @Override public OrderSuccessResult getResult (Order order) { ServiceOrderSuccessResult

设计模式:decorator模式

时光怂恿深爱的人放手 提交于 2019-11-28 23:59:48
两点: 继承同一虚接口,实现数据一致性 桥接方式指向被装饰类 目的: 在不改变被装饰类功能的前提下增加新功能 特点: 继承是子类和父类强耦合,桥接是低耦合 例子: class Print //抽象接口 { public: virtual int getColumns() = 0; //横向 virtual int getRows() = 0; //纵向 virtual string getRowContent(int row) = 0; virtual void show() { for(int i=0; i<getRows(); i++) { cout << getRowContent(i) << endl; } } }; class TextPrint: public Print //具体装饰类 { string content; public: TextPrint(string content) { this->content = content; } virtual int getColumns() { return content.size(); }; virtual int getRows() { return 1; } virtual string getRowContent(int row) { if(row == 0) { return content; }

桥接模式8(11)

我只是一个虾纸丫 提交于 2019-11-28 19:30:08
桥接是先有桥,才有两端的东西(可以分离某个东西) 适配是先有两边的东西,才有适配器 package structural.pratice; public class BridatePMain { public static void main(String[] args) { BridgeP bp = new BridgePRight(); CrossBridge cross = new CrossBridge(bp); cross.goRight(); } } //目的地与桥绑定 interface BridgeP{ public void crossBridge(); } //在桥右边 class BridgePRight implements BridgeP{ @Override public void crossBridge() { System.out.println("我到了桥右边"); } } abstract class BridgePLeft{ protected BridgeP bp; public BridgePLeft(BridgeP bp){ this.bp = bp; } public abstract void goRight(); } class CrossBridge extends BridgePLeft{ public CrossBridge

设计模式简介及常用应用场景

有些话、适合烂在心里 提交于 2019-11-28 12:48:42
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 常用应用场景: 工厂模式 :IOC就是典型的工厂模式 代理模式 :AOP就是代理实现的 Facade模式 :shiro框架的核心 单例模式 Spring默认就是单例 不变模式 string 八大基本数据类型都是单例 Future 模式 异步调用。即请求时只拿到一个契约,约定以后可以获取这个东西 来源: https://www.cnblogs.com/duguangming/p/11407721.html

设计模式-桥接模式

Deadly 提交于 2019-11-28 08:49:14
桥接模式的适用环境: 1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。 注意事项: 对于两个独立变化的维度,使用桥接模式再适合不过了。 示例: 交通工具:car、bus、bike是一类,共同点是可以行驶即run; 道路:城市道路、乡村道路、山路等是一类; 用road抽象类,作为桥接类,维护行为的实现 创建RunApi及car、bus、bike的实现 package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10:18 2019/8/23 */ public interface RunApi { /** * @param speed 速度 km/h * @param hour 时间 h */ public void run(int speed, int hour); } package com.design.demo.bridge; /** * @author: GuanBin * @date: Created in 下午10