• 设计模式——桥接模式


    桥接模式属于结构型模式,主要用于某一个类,需要体现两个维度上的特征!例如一碗面条的味道可能需要蔬菜和肉的类型两个维度描述(海带鸡丝面,酸菜牛肉面等),并且每一个维度不能使用基本类型的变量描述,需要使用类描述。

    桥接模式一般是由接口 + 抽象类 + 实现类描述的!

    接口描述一个维度,抽象类描述另一个维度,同时抽象类本身也是一个维度,实现类继承与抽象类!

    然而抽象类并不是继承于接口,而是聚合关系。接口作为抽象类的成员变量。

    关于桥接模式,有一句经典名言:将抽象部分与实现部分分离,使它们都可以独立的变化。

    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 蔬菜抽象接口
     * @author panteng
     * @date 17-2-7.
     */
    public interface VegetablesType {
        public String getVegetables();
    }
    VegetablesType
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 蔬菜实现类-海带
     * @author panteng
     * @date 17-2-8.
     */
    public class Kelp implements VegetablesType {
        public String getVegetables(){
            return "海带";
        }
    }
    Kelp
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 蔬菜实现类-酸菜
     * @author panteng
     * @date 17-2-8.
     */
    public class Sauerkraut implements VegetablesType {
        public String getVegetables(){
            return "酸菜";
        }
    }
    Sauerkraut
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 肉类抽象类
     * @author panteng
     * @date 17-2-7.
     */
    public abstract class AbstractMeatType {
        VegetablesType vegetablesType;
    
        public abstract String getMeat();
    
        public String getTaste(){
            return vegetablesType.getVegetables() + this.getMeat();
        }
    
        public VegetablesType getVegetablesType(){
            return vegetablesType;
        }
        public void setVegetablesType(VegetablesType vegetablesType){
            this.vegetablesType = vegetablesType;
        }
    }
    AbstractMeatType
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 肉类抽象类的实现 - 牛肉
     * @author panteng
     * @date 17-2-8.
     */
    public class Beef extends AbstractMeatType {
        @Override
        public String getMeat(){
            return "牛肉";
        }
    }
    Beef
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 肉类抽象类的实现 - 鸡肉
     * @author panteng
     * @date 17-2-8.
     */
    public class Chicken extends AbstractMeatType {
        @Override
        public String getMeat(){
            return "鸡肉";
        }
    }
    Chicken
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.bridge;
    
    /**
     * @description 桥接模式的应用
     * @author panteng
     * @date 17-2-8.
     */
    public class Client {
        public static void main(String[] arges){
            System.out.println("start... ...");
            Kelp kelp = new Kelp();
            Sauerkraut sauerkraut = new Sauerkraut();
    
            Beef beef = new Beef();
            beef.setVegetablesType(kelp);
            System.out.println(beef.getTaste());
    
            beef.setVegetablesType(sauerkraut);
            System.out.println(beef.getTaste());
        }
    }
    测试

    解释一下抽象和实现是如何分离的,将两个维度的变化属性分别定义为抽象类,两个抽象类直接使用聚合关系,与实现无关;分别定义两个维度的实现类,两个维度的实现无关,可以独立变化;

  • 相关阅读:
    LeetCode 93. Restore IP Addresses
    LeetCode 92. Reverse Linked List II
    LeetCode 94. Binary Tree Inorder Traversal
    javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别
    java关于jdbc的配置与使用步骤
    关于php中的include html文件的问题,为什么html可以在php中执行
    yii2 无法显示debug条的问题解决方法
    elasticsearch报错expected <block end>, but found BlockMappingStart解决方法
    sysctl -p 报错问题的解决方法
    yii2 Rbac使用yii命令一键建表
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6373480.html
Copyright © 2020-2023  润新知