`
Ydoing
  • 浏览: 100606 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

设计模式之桥接模式(Bridge)--结构模型

 
阅读更多

1.意图

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

2.适用性

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

3.结构

这里写图片描述

4.参与者

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

5.效果

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

6.实例

1)场景

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

2)UML图

桥接模式实例UML图

3)代码

AbstractMessage抽象类

public abstract class AbstractMessage {
    protected ISendMethod sm;

    public AbstractMessage(ISendMethod sm) {
        super();
        this.sm = sm;
    }

    public void sendMessage(String str){
        this.sm.send(str);
    }
}

CommonMessage类

public class CommonMessage extends AbstractMessage{
    public CommonMessage(ISendMethod sm) {
        super(sm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void sendMessage(String str) {
        // TODO Auto-generated method stub
        super.sendMessage(str);
    }
}

UrgentMessage类

public class UrgentMessage extends AbstractMessage{
    public UrgentMessage(ISendMethod sm) {
        super(sm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void sendMessage(String str) {
        // TODO Auto-generated method stub
        str += "(Urgent!!!)";
        this.sm.send(str);
    }
}

ISendMethod接口

public interface ISendMethod {
    public void send(String str);
}

SendEmail类

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

SendSms类

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

Main测试类

public class Main {
    public static void main(String[] args){
        ISendMethod sender = new SendEmail();
        AbstractMessage aMessage = new UrgentMessage(sender);
        aMessage.sendMessage("Test");

        ISendMethod sender2 = new SendSms();
        AbstractMessage aMessage2 = new CommonMessage(sender2);
        aMessage2.sendMessage("Test2");
    }
}

输出结果

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

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics