设计模式之桥模式
时间:2022-07-22
本文章向大家介绍设计模式之桥模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之桥模式
结构
说明
Decouple an abstraction from its implementation allowing the two to vary independently.
将一个抽象与实现解耦,以便两者可以独立的变化。
适用条件
- 不希望在业务和业务的具体实现之间存在固定的绑定关系;
- 希望类的抽象和实现部分可以扩充, 进而实现不同的抽象接口和实现部分的组合;
- 复用实现部分。
实现
interface IDrawingApi {
void DrawCircle(double x, double y, double radius);
}
class DrawingApi1 : IDrawingApi {
public void DrawCircle(double x, double y, double radius) {
Console.WriteLine("API1.circle at {0},{1} radius {2}", x, y, radius);
}
}
class DrawingApi2 : IDrawingApi {
public void DrawCircle(double x, double y, double radius) {
Console.WriteLine("API2.circle at {0},{1} radius {2}", x, y, radius);
}
}
abstract class Shape {
protected IDrawingApi DrawingApi;
protected Shape(IDrawingApi drawingApi) {
this.DrawingApi = drawingApi;
}
public abstract void Draw();
public abstract void ResizeByPercent(double percent);
}
class CircleShape : Shape {
private readonly double _x;
private readonly double _y;
private double _radius;
public CircleShape(double x, double y, double radius, IDrawingApi drawingApi)
: base(drawingApi) {
this._x = x;
this._y = y;
this._radius = radius;
}
public override void Draw() {
this.DrawingApi.DrawCircle(this._x, this._y, this._radius);
}
public override void ResizeByPercent(double percent) {
this._radius *= percent;
}
}
class Program {
static void Main(string[] args) {
var shapes = new Shape[] {
new CircleShape(1, 2, 3, new DrawingApi1()),
new CircleShape(5, 7, 11, new DrawingApi2()),
};
foreach (var shape in shapes) {
shape.ResizeByPercent(2.5);
shape.Draw();
}
Console.ReadKey();
}
}
- 如何使用Hue通过数据文件创建Collections
- GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析
- Memcached 命令执行漏洞(CVE-2016-8704、CVE-2016-8705、CVE-2016-8706)简析
- 使用Hue创建Ssh的Oozie工作流时重定向输出日志报错分析
- Joomla未授权创建特权用户漏洞(CVE-2016-8869)分析
- 检测本地文件躲避安全分析
- 如何在Kerberos的Linux上安装及配置Impala的ODBC驱动
- 对抗静态分析——so文件的加密
- Bypass unsafe-inline mode CSP
- Joomla未授权创建用户漏洞(CVE-2016-8870)分析
- 如何将HDFS文件系统挂载到Linux本地文件系统
- 使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器
- 响应式编程的实践
- S2-045 原理初步分析(CVE-2017-5638)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 移动端顺序问题上
- [USACO1.5]回文质数 Prime Palindromes
- 移动端上上(transform-translateZ注册)
- [USACO1.3]虫洞wormhole
- HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
- 移动端初级知识点解析:translateZ translateY rotateY(上上上)
- new String() split详解
- XML--XML从入门到精通 Part 1 认识XML
- css的linear-gradient注意点
- css的linear-gradient
- 第十届山东省赛L题Median(floyd传递闭包)+ poj1975 (昨晚的课程总结错了,什么就出度出度,那应该是叫讨论一个元素与其余的关系)
- css中border-radius
- css的border-radius注意点
- js的join split startsWith endsWith
- 详解length charAt indexOf lastIndexOf includes concat slice substring substr详解