C#面向对象设计之——桥接模式(八)

一、前言

桥接模式就是将抽象部分和它的实现部分分离,使它们都可以独立地变化。抽象与它的实现分离,实现是指抽象类和它的派生类用来实现自己的对象。就手机而言,手机既可以用品牌来分类,也可以以功能来分类。

在面向对象设计中,我们有一个很重要的原则:合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。

对象的继承关系是在编译时就已经定好了,所以无法再运行时改变从父类继承发生的变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。

例如做一部能够使用的手机,分为硬件部分和软件部分,它们组合起来才能够成为一部手机,如果我们可以让软件和硬件(或者说不通型号的手机)的耦合度分离,那么久可以大大减少面对新需求时改动过大的不合理情况,现在可以把“手机品牌”和“手机软件”抽象出来,让不同的品牌和功能分别继承它们,这样增加新的品牌或新的功能都不会影响到其他类了。

二、实例代码

namespace 桥接模式
{
    class Program
    {
        static void Main(string[] args)
        {
            HandsetBrand ab;
            ab = new HandsetBrandN();

            ab.SetHandsetSoft(new HandsetGame());
            ab.Run();

            ab.SetHandsetSoft(new HandsetAddressList());
            ab.Run();

            ab = new HandsetBrandM();

            ab.SetHandsetSoft(new HandsetGame());
            ab.Run();

            ab.SetHandsetSoft(new HandsetAddressList());
            ab.Run();

            Console.Read();
        }
    }

    //手机品牌
    abstract class HandsetBrand
    {
        protected HandsetSoft soft;

        //设置手机软件
        public void SetHandsetSoft(HandsetSoft soft)
        {
            this.soft = soft;
        }
        //运行
        public abstract void Run();

    }

    //手机品牌N
    class HandsetBrandN : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //手机品牌M
    class HandsetBrandM : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //手机品牌S
    class HandsetBrandS : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //手机软件
    abstract class HandsetSoft
    {

        public abstract void Run();
    }

    //手机游戏
    class HandsetGame : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("运行手机游戏");
        }
    }

    //手机通讯录
    class HandsetAddressList : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("运行手机通讯录");
        }
    }

    //手机MP3播放
    class HandsetMP3 : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("运行手机MP3播放");
        }
    }

}

三、总结

实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合度。

时间: 2024-08-27 19:13:29

C#面向对象设计之——桥接模式(八)的相关文章

C#面向对象设计之——命令模式(十五)

一.前言 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,另外对请求排队或记录请求日志,以及支持可撤销的操作. 二.结构图 三.实例代码 namespace 命令模式 { class Program { static void Main(string[] args) { //开店前的准备 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Co

C#面向对象设计之——代理模式(十三)

一.前言 代理模式是为其他对象提供一种代理以控制对这个对象的访问. 二.结构图 三.实例代码 namespace 代理模式 { class Program { static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); Console.Read(); } } abstract class Subject { public abstract void Request(); } class RealSub

C#面向对象设计之——备忘录模式Memento Pattern(二十三)

一.前言 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象回复到原先保存的状态. 二.结构图 三.实例代码 using System; using System.Collections.Generic; using System.Text; namespace 备忘录模式 { class Program { static void Main(string[] args) { Originator o = new Originator()

C#面向对象设计之——状态模式(十九)

一.前言 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断很简单,那就没必要用状态模式了. 二.结构图 三.实例代码 using System; using System.Collections.Generic; using System.Text; namespace 状态模式 { class P

【设计模式最终总结】桥接模式

桥接模式概述 桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”.与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式. 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩

【结构型模式】《大话设计模式》——读后感 (13)手机软件何时能统一?——桥接模式

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变换[DP] 概述:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 桥接模式的基本代码: 唯独一: AbstractCar: package com.sjmx.bridge; public abstract class AbstractCar { void r

[Unity 设计模式]桥接模式(BridgePattern)

1.前言 继上一讲IOC模式的基础上继续本讲桥接模式,笔者感觉桥接模式是23种设计模式中桥接模式是最好用但也是最难理解的设计模式之一,23中设计模式就好武侠剧中一本武功秘籍,我们在工作过程中想要熟练运用其中的每一种设计模式就好比跟高手过招想要能运用好武侠秘籍中的每一招每一式,并且能随着对手出招的不同我们能随机应变对应的招数,这就要求我们对每一种设计模式都理解的非常深刻才能运用自如,打出组合拳的效果. 2.需求 我们在FPS类游戏中会碰到这样的需求——实现武器和角色,无论是敌人还是我方角色都能通过

设计模式(八):Bridge桥接模式 -- 结构型模式

1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: •第一种设计方案是为每一种形状都提供一套各种颜色的版本. •第二种设计方案是根据实际需要对形状和颜色进行组合. 方案1: 方案2:  

设计模式之桥接模式(八)

设计模式之桥接模式 一.引言 每个人都有吃饭睡觉的行为,这时我们可以抽象出来一个人类型,然后让每个人去继承人类型,这时,每增加一个人,我们只需扩展一个子类就可以了,但是,人类型需要增加行为时,比如增加一个玩手机的行为,我们只许在人类型中扩展玩手机这一个方法,但是对于子类来说,如果这时子类数量相当庞大时,子类需要进行大量的修改. 我们可以使用桥接模式,将抽象和实现分离. 二.介绍 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象