一、完成者信息:
姓名:赖春林
学号:07770110
二、模式信息
1、模式名称:桥接模式
2、模式概述:
Bridge桥接模式是一种结构型模式,它主要应对的是:由于类型的固有罗辑,使得类型具有两个或两个以上的纬度变化。也就是要求抽象不应依赖于实现细节,实现细节应依赖于抽象。
桥接模式包括四种角色。
● 抽象(Abstraction):是一个抽象类,该抽象类含有Implementor声明的变量,即维护一个Implementor类型对象。
● 实现者(Implementor):实现者角色是一个接口(抽象类),该接口(抽象类)中的方法不一定与Abstraction类中的方法一致。Implementor接口(抽象类)负责定义基本操作,而Abstraction类负责定义基于这些基本操作的较高层次的操作。
● 细化抽象(Refined Abstraction):细化抽象是抽象角色的一个子类,该子类在重写(覆盖)抽象角色方法时,在给出一些必要的操作后,将委托所维护Implementor类型对象调用相应的方法。
● 具体实现者(Concrete Implementor):具体实现者是实现(扩展)Implementor接口(抽象类)的类。
3、定义:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
4、生活场景:
学生在教室上课。一门课程可能会在多个教室上课,一个教室能够供给多门课程上课。此时有两个变化的维度。
终极目标:学生选定拿对课本进对教室。
4.1. 不假思索的思路:
先建立一个教室类,然后不同的教室继承于该类。课程是在教室上上的,因此课程继承于教室。结构图如下:
实现代码:
public abstract class classRoom
{
public abstract void Write(string msg);
}
public class xianjiao_cr : classRoom
{
public override void Write(string msg)
{
Console.WriteLine("在现教上课");
}
}
public class peilou_cr : classRoom
{
public override void Write(string msg)
{
Console.WriteLine("在配楼上课");
}
}
public class sjjg : xianjiao_cr
{
public string _teacher;
public sjjg(string teacher)
{
this._teacher = teacher;
}
}
public class sf : peilou_cr
{
public string _teacher;
public sf(string teacher)
{
this._teacher = teacher;
}
}
public class Cplus : xianjiao_cr
{
public string _teacher;
public Cplus(string teacher)
{
this._teacher = teacher;
}
}
这时会发现如果加一些课程并且上课时间能错开,那可能每门课程能在上述教室中上课,这样显然有很多重复的代码造成子类膨胀。加入我们能够将教室和课程独立开,然后用某种方式将二者联系起来,那刚刚那种情况就解决了,而桥接模式正好能够实现这样的改变。
4.2. 归纳阶段
个人理解桥接模式事实上就有点像数据库设计中遵循第二范式,即:每个非主属性完全函数依赖于码。将抽象与实现分离的过程就是使数据库由第一范式转换为第二范式的过程。一个表是所有数据的抽象,每条记录便是抽象的具体对象。记录的变化并不会引起表结构的改变,在面向对象中是对实现者层次代码的修改对抽象层不产生影响。下面我们用桥接模式实现上述例子:
实现代码:
public abstract class classRoom
{
public abstract void havingClass();
}
public class xianjiao_cr : classRoom
{
public override void havingClass()
{
Console.WriteLine("在现教");
}
}
public class peilou_cr : classRoom
{
public override void havingClass()
{
Console.WriteLine("在配楼");
}
}
public abstract class Course
{
public classRoom _course;
public Course(classRoom course)
{
this._course = course;
}
public abstract string onClass();
}
public class sf : Course
{
public sf(classRoom classroom)
: base(classroom)
{
}
public override string onClass()
{
return "算法正在上课";
}
}
public class sjjg : Course
{
public sjjg(classRoom classroom)
: base(classroom)
{
}
public override string onClass()
{
return "数据结构正在上课";
}
}
class Program
{
static void Main(string[] args)
{
Course course = new sf(new xianjiao_cr());
Console.WriteLine(course.onClass());
course._course.havingClass();
Console.ReadLine();
}
}
5、验证阶段:
当前目标: 增加一个维度“人”,不同的人拿着相应的课本在不同的教室上课。
结果为:
添加一个人的类
结构图为:
代码实现:
public abstract class classRoom
{
public abstract void havingClass();
}
public class xianjiao_cr : classRoom
{
public override void havingClass()
{
Console.WriteLine("在现教");
}
}
public class peilou_cr : classRoom
{
public override void havingClass()
{
Console.WriteLine("在配楼");
}
}
public abstract class Course
{
public classRoom _course;
public Course(classRoom course)
{
this._course = course;
}
public abstract string onClass();
}
public class sf : Course
{
public sf(classRoom classroom)
: base(classroom)
{
}
public override string onClass()
{
return "算法正在上课";
}
}
public class sjjg : Course
{
public sjjg(classRoom classroom)
: base(classroom)
{
}
public override string onClass()
{
return "数据结构正在上课";
}
}
public abstract class people
{
public Course _course;
public people(Course course)
{
this._course=course;
}
public abstract void attendClass();
}
public class man : people
{
public string _name;
public man(string name, Course course)
: base(course)
{
this._name = name;
}
public override void attendClass()
{
Console.WriteLine(_name+"在听讲");
}
}
public class woman : people
{
public string _name;
public woman(string name, Course course)
: base(course)
{
this._name = name;
}
public override void attendClass()
{
Console.WriteLine(_name + "在听讲");
}
}
class Program
{
static void Main(string[] args)
{
Course course = new sf(new xianjiao_cr());
Console.WriteLine(course.onClass());
course._course.havingClass();
people pl = new man("张三",course);
pl.attendClass();
Console.ReadLine();
}
}
4、6、抽象阶段:
思路描述: 将抽象部分与它的实现部分分离,使它们都可以独立变化。
类结构图: