• 设计模式学习笔记——Bridge 桥接模式


    先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让model独立出来就可以上蹿下跳^_^

    现在看来,这句话,前半句是对的,后半句,有点牵强。
    具体实现方式(举例场景:每种手机可以装多个操作系统):

    1、将可变的地方抽象为接口,并将可变的情况继承自接口并实现

        public interface ISystem
        {
            string System();
        }
    public class IOSSystem : ISystem
        {
            public string System()
            {
                return "IOS";
            }
        }

    2、定义一个基类,将可变的地方使用接口申明为属性

        public abstract class BasePhone
        {
            public ISystem CurrentSystem = null;//可变的地方//public abstract string System();
            public abstract void Call();
            public abstract void Message();
        }

    3、将具体的实现类继承自基类

    public class Lumia : BasePhone
        {
            public override void Call()
            {
                Console.WriteLine("使用{0} {1}打电话", this.GetType(), CurrentSystem.System());
            }
    
            public override void Message()
            {
                Console.WriteLine("使用{0} {1}发短信", this.GetType(), CurrentSystem.System());
            }
        }

    4、在使用时,根据情况,将可变属性赋值

    BasePhone lumia = new Lumia();
                lumia.CurrentSystem = new IOSSystem();
                lumia.Message();
                lumia.Call();

    桥接模式的使用场景,当类和行为呈现m*n的代码爆炸情况时,在基类中使用接口封装变化点,在使用时,根据情况组合。增加程序的扩展性,使变化点具有扩展性。

    为什么要有基类呢?我觉得是为了约束类的不变因素。

    将偷懒进行到极致,是一个程序员的基本素养
  • 相关阅读:
    BZOJ4416 [Shoi2013]阶乘字符串 【序列自动机 + 状压dp】
    BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】
    快速求原根
    BZOJ2530 [Poi2011]Party 【贪心】
    BZOJ2213 [Poi2011]Difference 【乱搞】
    BZOJ2276 [Poi2011]Temperature 【单调队列】
    多项式除法
    loj2538 「PKUWC2018」Slay the Spire 【dp】
    loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】
    Java多线程之线程的暂停
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/9130664.html
Copyright © 2020-2023  润新知