• 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
    男性玩家购买武器装备!
    女性玩家购买武器装备!
    男性玩家购买铠甲装备!
    女性玩家购买铠甲装备!
  • 相关阅读:
    C# 类 根据属性名称取属性值
    WebService WCF 契约的解释
    NHibenate xml 数据库配置 说明
    使Spring.NET的IOC容器支持动态加载的程序集
    知识点滴:持久层,DAO,API,DAL,BLL,DLL,csproj,sln
    spring.net nhibernate 分布布式事务(下)
    简明教程 C# Webservice实例
    C# 中 以 &# 打头的 编码 是: html 编码解码地址 转换
    spring.net 结合简单三层实例
    关于行号输出的简单命令
  • 原文地址:https://www.cnblogs.com/innosight/p/3271151.html
Copyright © 2020-2023  润新知