【结构型】Bridge模式

桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化。简简单单的一句话,却已经是站在了更高抽象层面上来看待、设计、解决问题。平常我们多是对具体问题进行分析、抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可。这种情况下的结构关系图参考如下:

这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要增加N个对应的新class。为解决这类问题,需要将问题的具体实现剥离出来单独抽象,并在问题抽象层面与实现抽象层面做个关联桥接即可。从而在问题抽象层面上,就不需要关心当前问题是如何被解决的(即:如何实现的)。改进后的类关系图(即:Bridge模式的类关系图参考如下):

从关系图中可看出,不论是日后增加新Target,还是扩展新实现方式,对于逻辑结构都不需要做调整,也不会因为扩展了新的实现而引起整个Target系列的动荡。模式的编码结构参考如下:

 1 namespace bridge
 2 {
 3     class IImpl;
 4     class ITarget
 5     {
 6     public:
 7         virtual void doSomething() = 0;
 8         // some code here........
 9
10     protected:
11         IImpl* getImpl() { return _impl; }
12
13     private:
14         IImpl* _impl;
15
16     };//class ITarget
17
18     class ConcreteTarget : public ITarget
19     {
20     public:
21         virtual void doSomething() override {
22             auto pImpl = this->getImpl();
23             if (nullptr != pImpl) {
24                 pImpl->realDoSomething();
25             }
26             // some other code here........
27         }
28
29     };//class ConcreteTarget
30
31     class IImpl
32     {
33     public:
34         virtual void realDoSomething() = 0;
35
36     };//class IImpl
37
38     class ConcreteImpl1 : public IImpl
39     {
40     public:
41         virtual void realDoSomething() override { /* some code here........ */ }
42
43     };//class ConcreteImpl1
44
45     class ConcreteImpl2 : public IImpl
46     {
47     public:
48         virtual void realDoSomething() override { /* some code here........ */ }
49
50     };//class ConcreteImpl2
51
52 }//namespace bridge

Bridge模式编码结构参考

时间: 2024-10-13 11:35:52

【结构型】Bridge模式的相关文章

设计模式之结构型桥接模式

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦. function changeColor(dom, color, bg) { // 设置元素的字体颜色 dom.style.color = color; // 设置元素的背景颜色 dom.style.background = bg; } var spans = document.getElementsByTagName('span'); spans[0].onmouseover = function() { changeColor(t

JAVA设计模式(10):结构型-组合模式(Composite)

先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." /** * 抽象组件 */ public interface Component { void operation(); } /** * 叶子组件 */ interface Leaf extends Component{ } /** * 容器组件 */ interface Composite extends Component{ } public in

设计模式之结构型--代理模式

代理模式(Proxy pattern)核心作用: 通过代理,控制对对象的访问 可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后 做后置处理(即:AOP的微观实现) ----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制 --核心角色: 抽象角色: 定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口) 真实角色 实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用 代理角色 实现

设计模式-结构型-组合模式

组合模式(Composite): 定义: 组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性. 组合模式的角色: 1)抽象构建(Component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 2)树叶构件(Leaf):是组合中的叶节点对象,它没

结构型模式之适配器

结构型模式主要讲述如何组合类和对象以获取更大功能的结构,同样,按照模式的主要用途,结构型模式也分为两个层次: 1.结构型类模式,采用继承机制来组合接口,java没有多继承功能,但是可以实现(implements)多个接口,实现了多个父接口的类便拥有了父接口的功能,GOF给出的结构型类模式只有一个,那就是Adapter(适配器)模式,适配器模式的实现还可以用对象模式,一会儿会给出例子. 2.结构型对象模式,该类型的模式不是对接口进行组合,而是描述如何对一些对象进行组合,从而实现一些新功能.因为它可

C#设计模式之十三代理模式(Proxy)【结构型】

一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接面对这些繁琐.复杂的问题,但是这些事情是经"主人"同意

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的实现啊!那怎么还有这么个桥接的分离呢? 我们先来看个例子. 例如:汽车品牌内置导航仪,我们希望实现,每个品牌的导航仪都可以在任何一个牌子的汽车上安装并启动. 汽车品牌有两个:宝马.奔驰. 导航仪有三个牌子:神行者.北斗.高德. 来看正常的设计,我们肯定是会这样的采用继承来实现每个组合的安装和启动处理

设计模式(八):Bridge桥接模式 -- 结构型模式

1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: •第一种设计方案是为每一种形状都提供一套各种颜色的版本. •第二种设计方案是根据实际需要对形状和颜色进行组合. 方案1: 方案2:  

设计模式07: Bridge 桥接模式(结构型模式)

Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? 举例来说 假如我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能都一样,都有同样的类型,面临同样的需求变化,比如坦克可能有多种不同的型号:T50,T75,T90…… 对于其中坦克设计,我们可能很容易设计出来一个Tank的抽象基类: /// <summary> /// 抽象Tan