zoukankan      html  css  js  c++  java
  • java设计模式之桥接模式

    桥接模式的定义:

      桥接模式又叫作桥梁模式、接口模式或柄体模式,指将抽象部分与具体实现部分分离,使它们都可以独立的变化,属于结构性模式。

    桥接模式的主要目的是通过组合的方式建立两个类之间的联系,而不是继承,但又类是多重继承方案。但是多重继承方案往往违背了类

    的单一职责原则,其复用性比较差,桥接模式是比多重继承方案更好的替代方案。桥接模式的核心在于把抽象与实现解耦。

    桥接模式的运用场景:

    • 在抽象和具体实现之间需要增加更多灵活性的场景。
    • 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展。
    • 不希望使用继承,或因为多继承导致系统类的个数剧增。

    使用桥接模式设计稍复杂得消息系统:

      具给例子,我们在平时办公得时候经常通过邮件消息、短信消息、或者系统内消息与同时进行沟通。消息又会有紧急程度之分,分为

    普通消息、加急消息和特急消息。显然,整个消息系统可以划分为两个维度,下面我们来看看通过桥接模式如何解决这个问题,先创建一个

    IMessage接口担任桥接的角色类。

    public interface IMessage {
        //发送消息的内容和接收人
        void send(String message,String toUser);
    }

    创建邮件消息实现类EmailMessage类。

    public class EmailMessage implements IMessage {
        public void send(String message, String toUser) {
            System.out.println("使用邮件消息发送" + message + "给" + toUser);
        }
    }

    创建短线消息实现类SmsMessage类。

    public class SmsMessage implements IMessage {
        public void send(String message, String toUser) {
            System.out.println("使用短信消息发送" + message + "给" + toUser);
        }
    }

    创建桥接抽象角色AbastractMessage类。

    public abstract class AbastractMessage {
        private IMessage message;
    
        public AbastractMessage(IMessage message) {
            this.message = message;
        }
        void sendMessage(String message,String toUser){
            this.message.send(message,toUser);
        }
    }

    创建具体实现普通消息NomalMessage类。

    public class NomalMessage extends AbastractMessage {
    public NomalMessage(IMessage message) {
    super(message);
    }

    void sendMessage(String message, String toUser){
    message = "【普通】" + message;
    super.sendMessage(message,toUser);
    }
    }

    创建具体实现加急消息UrgencyMessage类。

    public class UrgencyMessage extends AbastractMessage {
        public UrgencyMessage(IMessage message) {
            super(message);
        }
    
        void sendMessage(String message, String toUser){
            message = "【加急】" + message;
            super.sendMessage(message,toUser);
        }
    
        public Object watch(String messageId){
            return null;
        }
    }

    测试代码。

    public class Test {
        public static void main(String[] args) {
            IMessage message = new SmsMessage();
            AbastractMessage abastractMessage = new NomalMessage(message);
            abastractMessage.sendMessage("加班申请","王总");
    
            message = new EmailMessage();
            abastractMessage = new UrgencyMessage(message);
            abastractMessage.sendMessage("加班申请","王总");
        }
    
    }

    测试结果如下:

     来看看对应的UML类图:

     由上图可以看到,桥接模式主要包含4个角色.

    1. 抽象(AbastractMessage):该类持有一个对实现角色(IMessage)的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现实例)。
    2. 修正抽象(UrgencyMessage和NomalMessage); 抽象的具体实现,对抽象的方法进行完善和扩展。
    3. 实现(IMessage):确定实现维度的基本操作,提供给抽象使用。该类一般为接口或者抽象类。
    4. 具体实现(EmailMessage和UrgencyMessage):实现的具体实现。

    桥接模式的优点:

    • 分离抽象部分及其具体实现部分。
    • 提高了系统的扩展性。
    • 符合开闭原则。
    • 符合合成复用原则。

    桥接模式的缺点:

    • 增加了系统的理解与设计难度。
    • 需要正确地识别系统中两个独立变化的维度。
  • 相关阅读:
    编码转换,基础补充,深浅拷贝,id is == ,代码块(了解),小数据池(了解)
    字典(dict),字典的嵌套,集合(set)
    列表,列表的增删改查,列表的嵌套,range
    整数,布尔值,字符串,字符串详解.
    [小明学Shader]4.自定义光照----RampTexture
    [小明学Shader]3.自定义光照,半拉姆伯特
    [小明学Shader]2.理解Shader和Material的关系
    [小明学Shader]1.Diffuse
    [UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?
    [小明也得懂架构]1.架构初探
  • 原文地址:https://www.cnblogs.com/liu-yi/p/13983139.html
Copyright © 2011-2022 走看看