zoukankan      html  css  js  c++  java
  • 设计模式之桥接模式(Bridge)--结构模型

    1.意图

    将抽象部分与它的实现部分分离,使它们可以独立地变化.

    2.适用性

    • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
    • 类的抽象与它的实现都应该可以通过子类的方式加以扩展。
    • 抽象部分与实现部分可以独立变化,而不会相互影响。
    • 从多维度扩展应用程序。

    3.结构

    Bridge.png

    4.参与者

    • Abstraction: 定义抽象的接口;维护一个指向Implementor对象的引用。
    • RefinedAbstraction: 扩充有Abstracttion定义的接口。
    • Implementor: 定义实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
    • ConcreteImplementor: 实现Implementor接口并定义它具体实现。

    5.效果

    1) 分离接口及其实现部分。
    2) 提供可扩展性。
    3) 实现细节对客户透明。

    6.实例

    1)场景

    在消息发送的场景中,消息类型抽象为普通消息和紧急消息,发送实现方式为邮件和短信。使用桥接模式,既可以在消息类型的维度上增加各种类型抽象,也可以在发送方式维度上增加各种实现方式。两者独立变化,实现解耦的效果。

    2)UML图

    3)代码

    AbstractMessage抽象类

    1. public abstract class AbstractMessage {
    2. protected ISendMethod sm;
    3. public AbstractMessage(ISendMethod sm) {
    4. super();
    5. this.sm = sm;
    6. }
    7. public void sendMessage(String str){
    8. this.sm.send(str);
    9. }
    10. }

    CommonMessage类

    1. public class CommonMessage extends AbstractMessage{
    2. public CommonMessage(ISendMethod sm) {
    3. super(sm);
    4. // TODO Auto-generated constructor stub
    5. }
    6. @Override
    7. public void sendMessage(String str) {
    8. // TODO Auto-generated method stub
    9. super.sendMessage(str);
    10. }
    11. }

    UrgentMessage类

    1. public class UrgentMessage extends AbstractMessage{
    2. public UrgentMessage(ISendMethod sm) {
    3. super(sm);
    4. // TODO Auto-generated constructor stub
    5. }
    6. @Override
    7. public void sendMessage(String str) {
    8. // TODO Auto-generated method stub
    9. str += "(Urgent!!!)";
    10. this.sm.send(str);
    11. }
    12. }

    ISendMethod接口

    1. public interface ISendMethod {
    2. public void send(String str);
    3. }

    SendEmail类

    1. public class SendEmail implements ISendMethod {
    2. @Override
    3. public void send(String str) {
    4. // TODO Auto-generated method stub
    5. System.out.println("This is a email message:"+ str);
    6. }
    7. }

    SendSms类

    1. public class SendSms implements ISendMethod {
    2. @Override
    3. public void send(String str) {
    4. // TODO Auto-generated method stub
    5. System.out.print("This a sms message:" + str);
    6. }
    7. }

    Main测试类

    1. public class Main {
    2. public static void main(String[] args){
    3. ISendMethod sender = new SendEmail();
    4. AbstractMessage aMessage = new UrgentMessage(sender);
    5. aMessage.sendMessage("Test");
    6. ISendMethod sender2 = new SendSms();
    7. AbstractMessage aMessage2 = new CommonMessage(sender2);
    8. aMessage2.sendMessage("Test2");
    9. }
    10. }

    输出结果

    This is a email message:Test(Urgent!!!)
    This a sms message:Test2





  • 相关阅读:
    《构建之法》第1.2.3章读后感
    回顾并总结关于复利计算器的三次实验
    实验0、了解和熟悉操作系统实验
    0302思考并回答一些问题
    递归下降语法分析程序设计
    1203有穷自动机的构造与识别
    评论集锦
    C语言文法定义与C程序的推导过程
    Vue简介教程(四)[自定义指令 | 路由 | 过渡 & 动画]
    Vue简介教程(三)[事件处理 | 表单 | 组件]
  • 原文地址:https://www.cnblogs.com/csu_xajy/p/4324411.html
Copyright © 2011-2022 走看看