C#设计模式:桥接模式(Bridge Pattern)
一,桥接模式,直接上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _7.桥接模式
{
//桥梁模式的用意是"将抽象化与实现化脱耦,使得二者存在两个独立变化的维度:人和人的事件"
//抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
class Program
{
static void Main(string[] args)
{
People p1 = new Chinese(new ChineseSpeak());
p1.PossceEvent(); People p2 = new Usa(new UsaSpeak());
p2.PossceEvent();
}
} public abstract class People //抽象部分。该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类
{
private PeopleEvent peopleEvent { get; set; } //定义接口或抽象类变量
public People(PeopleEvent _peopleEvent) //构造注入,接口或抽象类的实例
{
this.peopleEvent = _peopleEvent;
}
public void PossceEvent() //抽象化与实现化脱耦
{
peopleEvent.Say();
}
} public abstract class PeopleEvent//实现部分。可以为接口或者是抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分基本操作的业务方法;
{
public abstract void Say();
} public class Chinese : People //优化的抽象部分。抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
{
public Chinese(PeopleEvent _peopleEvent)
: base(_peopleEvent)
{ }
}
public class ChineseSpeak : PeopleEvent //实现部分的具体实现。完善实现部分中定义的具体逻辑。
{
public override void Say() //实现事件,这里针对不同的人,实现事件不一样,中国人说中文
{
Console.WriteLine("中国人说中文");
}
} public class Usa : People //优化的抽象部分。抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
{
public Usa(PeopleEvent _peopleEvent)
: base(_peopleEvent)
{ }
}
public class UsaSpeak : PeopleEvent //实现部分的具体实现。完善实现部分中定义的具体逻辑。
{
public override void Say() //实现事件,这里针对不同的人,实现事件不一样,美国人说英语
{
Console.WriteLine("美国人说英语");
}
}
}
二,总结:
1,桥梁模式的用意是"将抽象化与实现化脱耦,使得二者存在两个独立变化的维度(如上代码的人和人的事件)
2,当我们看到将抽象化与实现化脱耦,就会想到依赖注入,不错,这里就是使用依赖注入的构造注入的思想,将抽象和现实解耦,也就是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
3,但抽象和现实解耦还不是完全的桥梁模式,我们还需要使得二者可以独立地变化,那怎么才是独立的变化呢?
1》如上代码,抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
2》也就是根据上面的定义People可以有中国人和美国人,是一种维度的变化,而中国人和美国人又分别说不同的话,中文和英文这也是不同一个维度的变化,这也是抽象People和具体实现PeopleEvent,使得二者存在两个独立变化的理解
C#设计模式:桥接模式(Bridge Pattern)的更多相关文章
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 七个结构模式之桥接模式(Bridge Pattern)
问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...
- 设计模式 -- 桥接模式(Bridge)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...
随机推荐
- python pip安装模块报错 "Can't connect to HTTPS URL because the SSL module is not available."
在升级python版本为3.6之后,pip安装模块报错. 报错信息如图: 原因是系统自带的openssl版本与python3的版本不匹配,所以这里只要升级openssl版本就可以解决问题. yum - ...
- 2018-10-16-weekly
Algorithm 判断子序列 What 给定字符串 s 和 t ,判断 s 是否为 t 的子序列.如,"ace"是"abcde"的一个子序列,而"a ...
- 美国知名Cloudflare网络公司遭中国顶尖黑客攻击
最近中美贸易战愈演愈烈,美国知名Cloudflare网络公司的客户的分布式拒绝服务攻击今天在恶意流量方面达到了新的高度,黑客并袭击了该公司在欧洲和美国的数据中心.根据Cloudflare首席执行官马修 ...
- Beats:如何创建一个定制的Elastic Beat
Beats作为Elastic Stack家族中重要的部分.它可以和方便地让我们把我们的数据发送到Elasticsearch或Logstash之中.如果我们想要生成自己的Beat,请使用GitHub的b ...
- java Main方法 获取 maven 的resource 下的xml文件
Properties properties = new Properties(); File file = new File("src/main/resources/generator.xm ...
- 第四周作业—N42-虚怀若谷
一.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@centos7 ~]# grep -v "/sbin/nolo ...
- orm 查询数据库随机返回一条数据的解决办法用models.User.objests.all().order_by('?').first()
- MongoDB与阿里云达成战略合作,最新数据库独家上线阿里云!
11月26日,开源数据库厂商MongoDB与阿里云在北京达成战略合作,作为合作的第一步,最新版MongoDB 4.2数据库产品正式上线阿里云平台. 目前阿里云成为全球唯一可提供最新版MongoDB服务 ...
- FastDFS整合普通Maven项目(四)
1.下载官方的源代码:https://codeload.github.com/happyfish100/fastdfs-client-java/zip/master 2.采用maven命令编译成jar ...
- Sklearn----使用决策树预测隐形眼镜类型
import pandas as pd import pydotplus from sklearn.externals.six import StringIO #LabelEncoder:将字符串转换 ...