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)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...
随机推荐
- RAS
Reliability 高可靠性 Availability 高可用性 Serviceability 高服务性
- oracle汇编03
.long expression1, expression2, ..., expressionNThe .long directive generates a long integer (32-bit ...
- 【LeetCode】位运算 bit manipulation(共32题)
[78]Subsets 给了一个 distinct 的数组,返回它所有的子集. Example: Input: nums = [,,] Output: [ [], [], [], [,,], [,], ...
- Ubuntu下批量使用Tecplot的preplot命令对数据进行处理
首先把.PLT文件后缀批量修改为.dat rename 's/.PLT$/.dat/' *.PLT 对所有.dat文件批量执行preplot find ./ -name "*.dat&quo ...
- 【leetcode】1033. Moving Stones Until Consecutive
题目如下: Three stones are on a number line at positions a, b, and c. Each turn, you pick up a stone at ...
- 15:解决IntelliJ IDEA的乱码问题
1. -Dfile-encodings=UTF-8 ,全局:
- JS判断数组是否为空
var arr = []; if(arr == false){ console.log("arr is empty!"); }else{ console.log("arr ...
- easyui的datagrid里getSelections只能获取一行值???
使用getSelections只能获取到一行的值,检查了半天是因为idField属性值写错,更正之后ok. 解决办法二:改为使用getChecked,idField写错无影响, 注: getSelec ...
- Anaconda在Python3和Python2之间切换,Conda命令,anaconda中python的升级和降级
当在pycharm IDE中指定不同的Python版本时,设置方法 File->Setting->Project:XXXX->Project Interpreter 选择不同位 ...
- P1541乌龟棋
传送 这题咋做? 当然是爆搜了. 但是蒟蒻不会爆搜(TLE,WA两开花qwq),更不会记忆化搜索,所以我们换个思路. 注意这句话: 这肯定是有用的(洛咕还不会闲圈到给一句毛用都没有的话),那它有什么用 ...