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
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public abstract class Player {  
    4.   
    5.     private Equipment equipment;  
    6.   
    7.     private String gender;  
    8.   
    9.     public String getGender() {  
    10.         return gender;  
    11.     }  
    12.   
    13.     public void setGender(String gender) {  
    14.         this.gender = gender;  
    15.     }  
    16.   
    17.     public Equipment getEquipment() {  
    18.         return equipment;  
    19.     }  
    20.   
    21.     protected abstract void buyEquipment();  
    22. }  
    RefinedAbstraction
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public class MalePlayer extends Player {  
    4.   
    5.     public MalePlayer() {  
    6.         super.setGender("男性玩家");  
    7.     }  
    8.   
    9.     @Override  
    10.     public void buyEquipment() {  
    11.         super.getEquipment().playerBuyEquipment(this);  
    12.     }  
    13.   
    14. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public class FemalePlayer extends Player {  
    4.   
    5.     public FemalePlayer() {  
    6.         super.setGender("女性玩家");  
    7.     }  
    8.   
    9.     @Override  
    10.     public void buyEquipment() {  
    11.         super.getEquipment().playerBuyEquipment(this);  
    12.     }  
    13.   
    14. }  
    Implementor
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public abstract class Equipment {  
    4.   
    5.     protected abstract void playerBuyEquipment(Player player);  
    6.   
    7. }  
    ConcreteImplementor
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public class Arms extends Equipment {  
    4.   
    5.     @Override  
    6.     public void playerBuyEquipment(Player player) {  
    7.         System.out.println(player.getGender() + "购买武器装备!");  
    8.     }  
    9.   
    10. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public class Armour extends Equipment {  
    4.   
    5.     @Override  
    6.     public void playerBuyEquipment(Player player) {  
    7.         System.out.println(player.getGender() + "购买铠甲装备!");  
    8.     }  
    9.   
    10. }  
    Client
    [java] view plain copy
     
     print?
    1. package cn.lynn.bridge;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Player malePlayer = new MalePlayer();  
    7.         Player femalePlayer = new FemalePlayer();  
    8.         Equipment arms = new Arms();  
    9.         arms.playerBuyEquipment(malePlayer);  
    10.         arms.playerBuyEquipment(femalePlayer);  
    11.         Equipment armour = new Armour();  
    12.         armour.playerBuyEquipment(malePlayer);  
    13.         armour.playerBuyEquipment(femalePlayer);  
    14.     }  
    15.   
    16. }  
    Result
    [java] view plain copy
     
     print?
    1. 男性玩家购买武器装备!  
    2. 女性玩家购买武器装备!  
    3. 男性玩家购买铠甲装备!  
    4. 女性玩家购买铠甲装备!  
     
     
  • 相关阅读:
    消息队列非阻塞
    外挂简介
    mfc小工具开发之定时闹钟之---二十四小时时区和时间段
    mfc小工具开发之定时闹钟之---时间获取和音频播放
    mfc小工具开发之定时闹钟之---多线程急线程同步
    mfc小工具开发之定时闹钟之---功能介绍
    8127 timeout!!! 搞死人啊
    RGB565 转换 BMP24
    linux 格式化u盘
    linq分页扩展(转)
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471535.html
Copyright © 2011-2022 走看看