zoukankan      html  css  js  c++  java
  • 设计模式(七)桥接模式

      核心要点:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。

      桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。

      桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。

     

    如上图所示,用多层继承结构可以实现,但会出现扩展性问题以及违反单一职责原则(一个类,有两个引起这个类变化的原因)

    如上图 运用桥接模式

    1. 创建一个品牌Brand接口,并创建两个类实现该接口

     1 package com.ztq.bridge;
     2 
     3 /***
     4  * 品牌
     5  * @author ZTQ
     6  *
     7  */
     8 public interface Brand {
     9     void sale();
    10 }
    11 
    12 class Lenovo implements Brand{
    13 
    14     @Override
    15     public void sale() {
    16         System.out.println("销售联想电脑");
    17     }
    18     
    19 }
    20 
    21 class Dell implements Brand{
    22 
    23     @Override
    24     public void sale() {
    25         System.out.println("销售戴尔电脑");
    26     }
    27     
    28 }

    2. 创建机型Computer类,并创建子类

     1 package com.ztq.bridge;
     2 
     3 /***
     4  * 电脑类型的维度
     5  * @author ZTQ
     6  *
     7  */
     8 public class Computer{
     9     protected Brand brand;
    10 
    11     public Computer(Brand brand) {
    12         this.brand = brand;
    13     }
    14 
    15     public void sale(){
    16         brand.sale();
    17     }
    18     
    19 }
    20 
    21 class Desktop extends Computer{
    22 
    23     public Desktop(Brand brand) {
    24         super(brand);
    25     }
    26     
    27     public void sale(){
    28         super.sale();
    29         System.out.println("销售台式机");
    30     }
    31     
    32 }
    33 
    34 class Laptop extends Computer{
    35 
    36     public Laptop(Brand brand) {
    37         super(brand);
    38     }
    39     
    40     public void sale(){
    41         super.sale();
    42         System.out.println("销售笔记本");
    43     }
    44     
    45 }

    3.  测试类Client

     1 package com.ztq.bridge;
     2 
     3 public class Client {
     4     public static void main(String[] args) {
     5         //销售联想笔记本
     6         Computer c = new Laptop(new Lenovo());
     7         c.sale();
     8         
     9         //销售戴尔台式机
    10         Computer c2 = new Desktop(new Dell());
    11         c2.sale();
    12     }
    13 }

    结果

    销售联想电脑
    销售笔记本
    销售戴尔电脑
    销售台式机

    桥接模式实际开发中应用场景

    ——JDBC驱动程序

    ——AWT中的Peer架构

    ——银行日志管理:

      格式分类:操作日志、交易日志、异常日志

      距离分类:本地记录日志、异地记录日志

    ——人力资源系统中的奖金计算模块:

      奖金分类:个人奖金、团队奖金、激励奖金

      部门分类:人事部门、销售部门、研发部门

    ——OA系统中的消息处理:

      业务类型:普通消息、加急消息、特急消息

      发送消息方式:系统内消息、手机短信、邮件

  • 相关阅读:
    [BNUOJ] ACM Battle(贪心)
    [BNUOJ]Training Plan(贪心,dp)
    [BNUOJ]Squared Permutation(线段树,单点更新)
    可以处理重边的求割点(边)模板
    [Python] Spark平台下实现分布式AC自动机(一)
    [HDOJ2222]Keywords Search(AC自动机)
    [GCJ] Qualification Round 2017
    HDU 6298.Maximum Multiple-数学思维题(脑子是个好东西,可惜我没有) (2018 Multi-University Training Contest 1 1001)
    牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
    牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
  • 原文地址:https://www.cnblogs.com/zhangtianq/p/6075822.html
Copyright © 2011-2022 走看看