JAVA设计模式之【桥接模式】
桥接模式
蜡笔中颜色和型号之间存在耦合
毛笔中,颜色和型号解耦了
如果软件系统中某个类存在两个独立变化的维度,桥接模式可以将两个维度分离出来
角色
抽象类
扩充抽象类
实现类接口
提供基本操作
抽象类定义的接口会做更多更负责的操作
使用关联关系,替代继承关系
具体实现类
面向对象思想
单一职责原则
开闭原则
合成复用原则
里氏替换原则
依赖倒转原则
毛笔案例
毛笔型号维度
大毛笔
中毛笔
小毛笔
型号是毛笔的抽象部分,颜色是毛笔的实现部分
毛笔颜色维度
黑色
红色
灰色
蓝色
...
毛笔和颜色之间是聚合关系
图片案例
Image充当抽象类
子类JPGImage,PNGImage、BMPImage和GIFImage充当扩充抽象类
ImageImp充当实现类接口
子类WindowsImp、LinuxImp、UnixImp充当具体实现类
像素辅助类,Matrix,不同操作系统提供不同的方式显示像素矩阵
桥接模式可以和适配器模式结合使用
1.图片实现类接口
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public interface ImageImp {
public void doPaint(Matrix m);
}
2.图片抽象类
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
abstract class Image {
protected ImageImp imp;
public void setImageImp(ImageImp imp) {
this.imp = imp;
}
public abstract void parseFile(String fileName);
}
3.图片扩充抽象类
JPG
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class JPGImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为JPG");
}
}
PNG
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class PNGImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为PNG。");
}
}
GIF
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class GIFImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为GIF。");
}
}
BMP
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class BMPImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为BMP。");
}
}
4.具体实现类
Windows
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class WindowsImp implements ImageImp{
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.println("在Windows操作系统中显示图像:");
}
}
Linux
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class LinuxImp implements ImageImp{
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.println("在Linux操作系统中显示图像:");
}
}
Unix
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class UnixImp implements ImageImp{
public void doPaint(Matrix m) {
System.out.println("在Unix操作系统中显示图像:");
}
}
5.客户端
package Bridge;
/**
* Created by e550 on 2016/10/3.
*/
public class Client {
public static void main(String args[]) {
Image image;
ImageImp imp;
image = new GIFImage();
imp = new LinuxImp();
image.setImageImp(imp);
image.parseFile(" 日出美景");
}
}
执行结果
在Linux操作系统中显示图像:
日出美景,格式为GIF。
再看一个笔的例子
1.Color接口
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public interface Color {
void bepaint(String penType,String name);
}
2.Pen抽象类
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public abstract class Pen {
protected Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw(String name);
}
3.Color接口实现
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class Black implements Color{
public void bepaint(String penType,String name) {
System.out.println(penType + "黑色的" + name + ".");
}
}
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class Blue implements Color{
public void bepaint(String penType,String name) {
System.out.println(penType + "蓝色的" + name + ".");
}
}
4.Pen抽象类实现
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class BigPen extends Pen{
public void draw(String name) {
String penType="大号毛笔绘制";
this.color.bepaint(penType,name);
}
}
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class MiddlePen extends Pen{
public void draw(String name) {
String penType = "中型笔绘制";
this.color.bepaint(penType,name);
}
}
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class SmallPen extends Pen{
public void draw(String name) {
String penType = "小型笔绘制";
this.color.bepaint(penType,name);
}
}
5.客户端
package Bridge.PenColor;
/**
* Created by e550 on 2016/10/3.
*/
public class Client {
public static void main(String args[]) {
Color color;
Pen pen;
color = new Blue();
pen = new BigPen();
pen.setColor(color);
pen.draw("鲜花");
}
}
执行结果
大号毛笔绘制蓝色的鲜花
JAVA设计模式之【桥接模式】的更多相关文章
- java设计模式7——桥接模式
java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...
- java设计模式之桥接模式
桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...
- Java设计模式:桥接模式
问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何 ...
- Java设计模式应用——桥接模式
性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...
- java设计模式之-----桥接模式
一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又 ...
- JAVA设计模式之桥接模式(bridge)
桥接模式: 分离抽象与具体实现,让他们可以独自发展,防止类爆炸 场景: 过年走亲戚是我们中国人传统的习俗,走亲戚那就少不了要买东西(苹果,牛奶等等),这些具体的东西就是具体的类 蒙牛牛奶,有机苹果,有 ...
- 八戒转世投胎竟然是Java设计模式:桥接模式
目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...
- java面试题之----jdbc中使用的设计模式(桥接模式)
1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
随机推荐
- c++ std
高中只是听说过stl,每次问老师老师都会说“有毒,千万别学”,于是stl有毒的言论深深的印在我脑海,看到就恐惧,于是一直没有学,但是大学后确实很多用到stl的地方必须去学习了. 现在想想老师当年的说法 ...
- ASP.NET Core-组件:目录
ylbtech-ASP.NET Core-组件:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http ...
- js如何计算浮点数
js中浮点型是如何运算的呢? 例如:var a=0.69; 我想得到6.9 直接这样写 var c=a*10; alert(c); 得到结果是:6.8999999999999995 到网上一搜,有 ...
- crawler4j详细配置
控制器类必须传一个类型为CrawlConfig的参数,用于配置crawler4j.下面描述了一些关于配置的细节. 抓取深度 默认情况下没有抓取深度的限制.可以通过配置来限制深度,比如,你有个种子页面A ...
- QT-解除connect
前言:解除关联. 一.新建工程 二.新建部件 在ui设计界面拖入一个line edit,一个label以及两个button按钮 右键“关联”按钮转到槽,选择clicked(),添加如下代码: void ...
- SpringMVC框架入门
简介 SpringMVC采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑.数据与界面显示分离.用通俗的话来讲,MVC的理念就是把数据处理.数据展示和程序/用户的 ...
- Codeforces Round #506 (Div. 3) D-F
Codeforces Round #506 (Div. 3) (中等难度) 自己的做题速度大概只尝试了D题,不过TLE D. Concatenated Multiples 题意 数组a[],长度n,给 ...
- No content type provided for validation of a content model---WebLogic问题
一个web项目,复制到Weblogic domain下的autodeploy目录下,可是从BEA管理控制台中的Deployments下却找不到该项目,奇怪了,这个以前拷过来就可以用的啊?! 查看控制台 ...
- 关于npm警告fsevents和vue-cli项目中的一些问题,持续更新
1.install一个npm包的时候,总是会报这个警告: 网上查资料知道,这个fsevents是mac下用的,windows忽略即可: 2.关于在main.js中引入less文件的问题, 就会报这个错 ...
- python web开发 编写web框架
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...