设计模式(7)-结构型模式-Bridge模式
2.结构性模式
2.2 BRIDGE模式
别名:handle/body
这个模式体现了组合相对于继承的优势。
2.2.1动机
当一个抽象可能有多个实现时,通经常使用继承来协调它们。抽象类定义对该抽象的接口,而详细的子类则用不同方式加以实现。可是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行改动、扩充和重用。而组合方式能够使得通过抽象部分与实现部分进行独立的改动。
2.2.2结构
Client
— Bridge模式的使用者
•Abstraction
— 定义抽象类的接口。
— 维护一个指向Im p l e m e n t o r 类型对象的指针。
•RefinedAbstraction
— 扩充由Ab s t r a c t i o n定义的接口。
•Implementor
— 定义实现类的接口,该接口不一定要与A b s t r a c t i o n的接口全然一致;其实这两个接口能够全然不同。一般来讲, I m p l e m e n t o r接口仅提供基本操作,而 A b s t r a c t i o n则定义了基于这些基本操作的较高层次的操作。
•ConcreteImplementor
— 实现Im p l e m e n t o r 接口并定义它的详细实现。
2.2.3 效果
1) 分离接口及事实上现部分 一个实现未必不变地绑定在一个接口上。抽象类的实现能够在执行时刻进行配置,一个对象甚至能够在执行时刻改变它的实现。
2) 提高可扩充性 你能够独立地对Ab s t r a c t i o n和Im p l e m e n t o r 层次结构进行扩充。
3 ) 实现细节对客户透明 你能够对客户隐藏实现细节,比如共享I m p l e m e n t o r对象以及对应的引用计数机制(假设有的话) 。
2.2.4 样例-C++
代码片断1:Abstraction.h
//Abstraction.h
#ifndef _ABSTRACTION_H_
#define _ABSTRACTION_H_
class AbstractionImp;
class Abstraction
{
public:
virtual ~Abstraction();
virtual voidOperation() = 0;
protected:
Abstraction();
private:
};
class RefinedAbstraction :public
Abstraction
{
public:
RefinedAbstraction(AbstractionImp*
imp);
~RefinedAbstraction();
void Operation();
protected:
private:
AbstractionImp* _imp;
};
#endif //~_ABSTRACTION_H
//Abstraction.cpp
#include"Abstraction.h"
#include"AbstractionImp.h"
#include<iostream>
using namespace std;
Abstraction::Abstraction()
{
}
Abstraction::~Abstraction()
{
}
RefinedAbstraction::RefinedAbstraction(Abstra
ctionImp* imp)
{
_imp = imp;
}
RefinedAbstraction::~RefinedAbstraction()
{
}
void RefinedAbstraction::Operation()
{
_imp->Operation();
}
代码片断3:AbstractionImp.h
//AbstractionImp.h
#ifndef _ABSTRACTIONIMP_H_
#define _ABSTRACTIONIMP_H_
class AbstractionImp
{
public:
virtual ~AbstractionImp();
virtual voidOperation() = 0;
protected:
AbstractionImp();
private:
};
class ConcreteAbstractionImpA :public
AbstractionImp
{
public:
ConcreteAbstractionImpA();
~ConcreteAbstractionImpA();
virtual voidOperation();
protected:
private:
};
class ConcreteAbstractionImpB :public
AbstractionImp
{
public:
ConcreteAbstractionImpB();
~ConcreteAbstractionImpB();
virtual voidOperation();
protected:
private:
};
#endif //~_ABSTRACTIONIMP_H_
代码片断4:AbstractionImp.cpp
//AbstractionImp.cpp
#include"AbstractionImp.h"
#include<iostream>
using namespace std;
AbstractionImp::AbstractionImp()
{
}
AbstractionImp::~AbstractionImp()
{
}
void AbstractionImp::Operation()
{
cout << "AbstractionImp....imp..." << endl;
}
ConcreteAbstractionImpA::ConcreteAbstractio
nImpA()
{
}
ConcreteAbstractionImpA::~ConcreteAbstracti
onImpA()
{
}
void ConcreteAbstractionImpA::Operation()
{
cout << "ConcreteAbstractionImpA...." << e
ndl;
}
ConcreteAbstractionImpB::ConcreteAbstractio
nImpB()
{
}
ConcreteAbstractionImpB::~ConcreteAbstracti
onImpB()
{
}
void ConcreteAbstractionImpB::Operation()
{
cout << "ConcreteAbstractionImpB...." << e
ndl;
}
代码片断5:main.cpp
//main.cpp
#include"Abstraction.h"
#include"AbstractionImp.h"
#include<iostream>
using namespace std;
int main(int argc,
char*argv[])
{
AbstractionImp*imp = new
ConcreteAbstractionImpA();
Abstraction*abs = new
RefinedAbstraction(imp);
abs->Operation();
return 0;
}
2.2.5 样例-JAVA
Implementor类:
1. package com.qianyan.bridge;
2.
3. public interface Engine {
4.
5. /**
6. * 安装发动引擎
7. */
8. public void installEngine();
9. }
ConcreteImplementor类:
1. package com.qianyan.bridge;
2.
3. public class Engine2000 implements Engine {
4.
5. @Override
6. public void installEngine() {
7. System.out.println("安装2000CC发动引擎");
8. }
9.
10.}
1. package com.qianyan.bridge;
2.
3. public class Engine2200 implements Engine {
4.
5. @Override
6. public void installEngine() {
7. System.out.println("安装2200CC发动引擎");
8. }
9.
10.}
Abstraction类:
1. package com.qianyan.bridge;
2.
3. public abstract class Vehicle {
4.
5. private Engine engine;
6.
7. public Vehicle(Engine engine) {
8. this.engine = engine;
9. }
10.
11. public Engine getEngine() {
12. return engine;
13. }
14.
15. public void setEngine(Engine engine) {
16. this.engine = engine;
17. }
18.
19. public abstract void installEngine();
20.}
Refined Abstraction类:
1. package com.qianyan.bridge;
2.
3. public class Bus extends Vehicle {
4.
5. public Bus(Engine engine) {
6. super(engine);
7. }
8.
9. @Override
10. public void installEngine() {
11. System.out.print("Bus:");
12. this.getEngine().installEngine();
13. }
14.
15.}
1. package com.qianyan.bridge;
2.
3. public class Jeep extends Vehicle {
4.
5. public Jeep(Engine engine) {
6. super(engine);
7. }
8. @Override
9. public void installEngine() {
10. System.out.print("Jeep:");
11. this.getEngine().installEngine();
12. }
13.
14.}
1. package com.qianyan.bridge;
2.
3. public class MainClass {
4. public static void main(String[] args) {
5. Engine engine2000 = new Engine2000();
6. Engine engine2200 = new Engine2200();
7.
8. Vehicle bus = new Bus(engine2000);
9. bus.installEngine();
10.
11. Vehicle jeep = new Jeep(engine2200);
12. jeep.installEngine();
13. }
14.}
Result:
1. Bus:安装2000CC发动引擎
Jeep:安装2200CC发动引擎
设计模式(7)-结构型模式-Bridge模式的更多相关文章
- 【设计模式】结构型03外观模式(Facade Pattern)
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...
- 【设计模式】结构型04桥接模式(Bridge Pattern)
学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...
- 【结构型】Bridge模式
桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基 ...
- 【设计模式】结构型05组合模式(Composite Pattern)
组合模式(Composite Pattern) 意图:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 主要解决:它在我们 ...
- 【设计模式】结构型01代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...
- 【结构型】Flyweight模式
享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...
- Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- python设计模式---结构型之代理模式
主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...
随机推荐
- hdu 1005 Number Sequence(矩阵连乘+二分快速求幂)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1005 代码: #include<iostream> #include<stdio.h&g ...
- Redis中的持久化操作
本篇博客主要来解说一下怎样Redis中的持久化操作,当然了不是一篇理论性的博客,主要还是分享一下在redis中怎样来配置持久化操作. 1.介绍 redis为了内部数据的安全考虑,会把本身的数 ...
- OpenCV图像处理篇之边缘检測算子
3种边缘检測算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性.沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于 ...
- thinkphp5项目--企业单车网站(六)
thinkphp5项目--企业单车网站(六) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...
- 2015北京网络赛 J Scores bitset+分块
2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...
- vue-router学习例子分享
http://blog.csdn.net/bboyjoe/article/details/52804988 <!DOCTYPE html> <html lang="en&q ...
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- css3 边框阴影效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- QNX与Linux两家未来有望独霸车载电子操作系统
车载电子操作系统是汽车智能化的核心,能够有效分配车机的硬件资源,对车内各种任务功能进行协同管理,并控制各项任务优先级别.常见的车载电子操作系统有:QNX.Linux(Android,AaliOS).W ...
- mysql中group by和order by混用 结果不是理想结果
在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 ...