桥接设计模式(Bridge)
Bridge???
Bridge的意思是“桥梁”。就像在现实世界中,桥梁的功能是将河流的两侧连接起来一样,Bridge模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。
- 父类通过声明抽象方法来定义接口(APl):需要使用继承强关联方式,那么必须使用中间层抽象子类来实现方法的可变性。所以在聚合关系中考虑引入DisplayImpl 抽象层
- 子类通过实现具体方法来实现接口(APl):这种层次结构被称为“类的实现层次结构”。当我们以其他方式实现AbstractClass时,例如要实现一个AnotherConcreteClass时,类的层次结构会稍微发生一些变化。
理解职责
通俗理解办法:Bridge 是连通桥梁两端 是具体抽象层 与具体的实现类 建立关系的必然。
需要明确的:序中依赖于操作系统的部分划分为Windows版、Macintosh版、Unix版,那么我们就可以用Bridge模式中的“类的实现层次结构”来表现这些依赖于操作系统的部分。也就是说,我们需要编写一个定义这些操作系统的共同接口(API)的Implementor角色,然后编写Windows版、Macintosh版、Unix版的3个Concretelmplementor角色。这样一来,无论在“类的功能层次结构”中增加多少个功能,它们都可以工作于这3个操作系统上。
职责实现功能:完成不同功能的字符显示
在桥的哪一侧|名字|说明
|类的功能层次结构 ====>|Display|负责“显示”的类
类的功能层次结构 ====>|CountDisplay|增加了“只显示规定次数”这一功能的类
类的实现层次结构 ====>|DisplayImpl 负责“显示”的类
|类的实现层次结构 ====>|stringDisplayImp1“用字符串显示”的类
Main测试程序行为 ====>的类
UML
Code
Display:
public class Display {
/**
* 交给抽象子类去实现
*/
private DisplayImpl displayimpl;
public Display(DisplayImpl displayimpl) {
this.displayimpl = displayimpl;
}
protected void open(){
displayimpl.rawOpen();
}
protected void printr(){
displayimpl.rawPrint();
}
protected void close(){
displayimpl.rawClose();
}
public void display(){
open();
printr();
close();
}
}
假设需求改变 我们需要在Display基础上增加功能:
public class randomDisplay extends Display {
public randomDisplay(DisplayImpl displayimpl) {
super(displayimpl);
}
public void randomDisplay(int times) {
Random random = new Random();
int len=random.nextInt(times);
super.open();
for (int i = 0; i < len; i++) {
super.printr();
}
super.close();
}
}
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl displayimpl) {
super(displayimpl);
}
public void multiDisplay(int times){
super.open();
for (int i = 0; i < times; i++) {
super.printr();
}
super.close();
}
}
书上没有明确这个 称之为 抽象实现者 :我暂且称之为 Bridge器 必须抽象
public abstract class DisplayImpl {
/**
* 作为bridge 强关联 解耦的关键性 地方 不可以为 class 必须为abstract class
*/
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
测试:
**/
public class MainT {
public static void main(String[] args) {
Display display=new Display(new StringDisplayImpl("bridge design method"));
Display display1=new CountDisplay(new StringDisplayImpl("on first bridge"));
display.display();
display1.display();
((CountDisplay) display1).multiDisplay(3);
// 随机次数
Display display2=new randomDisplay(new StringDisplayImpl("two sencond bridge"));
((randomDisplay) display2).randomDisplay(5);
}
}
桥接设计模式(Bridge)的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 设计模式的征途—8.桥接(Bridge)模式
在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- 设计模式:桥接(Bridge)模式
设计模式:桥接(Bridge)模式 一.前言 写到这里,基本上就是对前面几种模式的扩展和区别了,可以看到我们前面的几种模式,很多时候都出现了重叠,这里要分清一个概念,模式并不是完全隔离和独立的,有 ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- ② 设计模式的艺术-08.桥接(Bridge)模式
为什么需要桥接(Bridge)模式 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题? 采用多层继承结构: 多层继承结构代码示例 Computer.java package co ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 设计模式之桥接(bridge)模式
在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
随机推荐
- URAL - 1297 Palindrome —— 后缀数组 最长回文子串
题目链接:https://vjudge.net/problem/URAL-1297 1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB ...
- deepin网络加速
0.进入控制中心里的“更新设置”,选择速度最快的镜像源(我的是阿里云)1.安装dnsmasq(命令:sudo aptitude install dnsmasq)2.以管理员权限打开gedit(命令:s ...
- Linux三种网络-vmware三种网络模式
Host-Only 桥接 NAT VMware虚拟机三种联网方法及原理 一.Brigde——桥接:默认使用VMnet0 1.原理: Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别 ...
- vs2015professional过期后登录微软账户仍然不能使用的解决方法
今天安装了vs2015pro版,找到了一个可以正常使用的密钥 2015 pro(专业版)key:HMGNV-WCYXV-X7G9W-YCX63-B98R2 注意是专业版,非企业版 来源:https:/ ...
- mvn使用记录
1. mvn dependency:copy-dependencies 会导出到targed/dependency 下面 2. mvn dependency:copy-dependencies -Do ...
- C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- ActorModel 概念翻译
学习 skynet 时初次接触到 ActorModel 模型,始终觉得有必要从宏观上了解 ActorModel 的概念,所以以维基上这篇文章为参考,把文章中的部分内容翻译成中文,好让自己体会一下 Ac ...
- bzoj 4503 两个串 快速傅里叶变换FFT
题目大意: 给定两个\((length \leq 10^5)\)的字符串,问第二个串在第一个串中出现了多少次.并且第二个串中含有单字符通配符. 题解: 首先我们从kmp的角度去考虑 这道题从字符串数据 ...
- 【240】◀▶IEW-Unit05
Unit 5 Education: Study Abroad 表格技巧讲解 1. Model1对应表格分析 This table shows the numbers of international ...
- 0001_第一个测试小程序Login
# -*- coding:utf-8 -*- user = raw_input("Username:") password = raw_input("Password:& ...