zoukankan      html  css  js  c++  java
  • GoF23种设计模式之结构型模式之桥接模式

    一、概述
            将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。
    二、适用性
    1.你不希望在抽象和实现之间有一个固定的绑定关系的时候。例如:在程序运行时实现部分应可以被选择或切换。
    2.类的抽象以及实现都应该可以通过生成子类的方法加以扩充的时候。桥接模式使你可以对不同的抽象接口和实现进行组合,并且分别对它们进行扩充。
    3.对一个抽象的实现部分的修改应对客户不产生影响的时候,即客户的代码不必重新编译。
    4.你必须将一个对象分解成两个部分的时候。
    5.你想在多个对象间共享实现(可能使用引用计数),但是同时要求客户并不知情的时候。
    三、参与者
    1.Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。
    2.RefinedAbstraction:扩充由Abstraction定义的接口。
    3.Implementor:定义实现类的接口。该接口不一定要与Abstraction接口完全一致。事实上可以完全不同。一般而言,Implementor接口提供基本操作,而Abstraction接口提供较高层次操作。
    4.ConcreteImplementor:实现Implementor接口,并且定义它的具体实现。
    四、类图

    五、示例
    Abstraction
    package cn.lynn.bridge;
    
    public abstract class Player {
    
        private Equipment equipment;
    
        private String gender;
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public Equipment getEquipment() {
            return equipment;
        }
    
        protected abstract void buyEquipment();
    }
    
    RefinedAbstraction
    package cn.lynn.bridge;
    
    public class MalePlayer extends Player {
    
        public MalePlayer() {
            super.setGender("男性玩家");
        }
    
        @Override
        public void buyEquipment() {
            super.getEquipment().playerBuyEquipment(this);
        }
    
    }
    
    package cn.lynn.bridge;
    
    public class FemalePlayer extends Player {
    
        public FemalePlayer() {
            super.setGender("女性玩家");
        }
    
        @Override
        public void buyEquipment() {
            super.getEquipment().playerBuyEquipment(this);
        }
    
    }
    
    Implementor
    package cn.lynn.bridge;
    
    public abstract class Equipment {
    
        protected abstract void playerBuyEquipment(Player player);
    
    }
    
    ConcreteImplementor
    package cn.lynn.bridge;
    
    public class Arms extends Equipment {
    
        @Override
        public void playerBuyEquipment(Player player) {
            System.out.println(player.getGender() + "购买武器装备!");
        }
    
    }
    
    package cn.lynn.bridge;
    
    public class Armour extends Equipment {
    
        @Override
        public void playerBuyEquipment(Player player) {
            System.out.println(player.getGender() + "购买铠甲装备!");
        }
    
    }
    
    Client
    package cn.lynn.bridge;
    
    public class Client {
    
        public static void main(String[] args) {
            Player malePlayer = new MalePlayer();
            Player femalePlayer = new FemalePlayer();
            Equipment arms = new Arms();
            arms.playerBuyEquipment(malePlayer);
            arms.playerBuyEquipment(femalePlayer);
            Equipment armour = new Armour();
            armour.playerBuyEquipment(malePlayer);
            armour.playerBuyEquipment(femalePlayer);
        }
    
    }
    
    Result
    男性玩家购买武器装备!
    女性玩家购买武器装备!
    男性玩家购买铠甲装备!
    女性玩家购买铠甲装备!
  • 相关阅读:
    js如何实现上拉加载更多...
    基于epoll的TP传输层实现
    ActiveMQ简介与安装
    序列化和反序列化实现
    NoSQL之Redis数据库初探
    分布式缓存之memcached--命令测试
    Java正则表达式测试用例
    Java之正则表达式
    Java反射机制练习(增强可扩展性)
    Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
  • 原文地址:https://www.cnblogs.com/innosight/p/3271151.html
Copyright © 2011-2022 走看看