设计模式之桥接模式(Java语言描述)
2015-11-21 00:12
666 查看
桥接模式定义
將抽象部分与它的具体实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。Decouple an abstraction from its implementation so that the two can vary independently.
单从定义来看,读者未必能够真正理解桥接模式的含义,假设我们有这样的应用场景,在一个CAD系统中我们需要绘制矩形、圆形、长方形三种图形,同时绘制的图形需要有蓝色、红色、绿色三种版本,此时我们至少有两种设计方案:
1.为每一种形状各自提供一套不同颜色的版本。
2.根据实际需要对图形和颜色进行任意组合。
两种设计方案对比:
第一种方案需要9个类,而且每增加一个颜色或图形系统中都要增加多个类。
第二种只需要6个类,且每增加一个一个形状或颜色只增加一个类。
像这种有两个维度的情况采用方案二进行设计,能够减少系统中类的个数,且系统扩展更为方便。设计方案二就是传说中的桥接模式的应用。桥接模式將继承关系转换为聚合关系,从而降低了类之间的耦合度。
桥接模式结构
桥接模式结构如下图所示:
桥接模式包含如下几个角色:
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类
源代码
实现类接口Implementor:public interface Implementor { void operationImpl(); }实现类ConcreteImplementorA:
public class ConcreteImplementorA implements Implementor{ @Override public void operationImpl() { System.out.println("ConcreteImplementorA operationImpl"); } }实现类ConcreteImplementorB:
public class ConcreteImplementorB implements Implementor{ @Override public void operationImpl() { System.out.println("ConcreteImplementorB operationImpl"); } }抽象类Abstraction:
public class ConcreteImplementorB implements Implementor{ @Override public void operationImpl() { System.out.println("ConcreteImplementorB operationImpl"); } }扩充抽象类RefinedAbstraction代码:
public class RefinedAbstraction extends Abstraction{ @Override public void operation() { this.getImpl().operationImpl(); } }客户端Client:
public class Client { public static void main(String[] args) { Abstraction abs = new RefinedAbstraction(); //具体实现交给客户端选择 Implementor impl = new ConcreteImplementorB(); abs.setImpl(impl); abs.operation(); } }
桥接模式的核心思想就是变继承关系为聚合关系,再回到绘制不同颜色图形的例子,使用桥接模式设计类图如下,具体的颜色由客户端进行选择。
相关文章推荐
- 设计模式之桥接模式(Java语言描述)
- Java语法知识 --整理自《thingking in Java》
- 黑马入学测试—基础—Java 面向对象的四个特征
- Javase基础部分笔记之IO(二)
- Java异常之catch语句块
- Spring 缓存
- spring mvc集成websocket
- java图形界面初步掌握
- [spring]事务传播级别隔离级别以及高并发下的应用经验
- javaBean验证用户姓名是否有效
- java.util.Date和java.sql.Date这两个有什么区别?
- 多线程实例
- java多线程——生产者消费者问题
- java并发编程——violate关键字使用场景
- Javase基础部分笔记之IO(一)
- 设计模式实例学习-模板方法
- 杭电ACM1003,1004,1005 java解答
- 4. Spring Boot 1.2.5,Spring Data JPA多数据源支持
- 第一次spring冲刺第9天
- 2. Spring Boot 1.2.5 不允许加载iframe问题解决