外观模式,是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。
不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,如图1(A)所示,而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什么样的茶,是铁观音、碧螺春还是西湖龙井?正因为茶馆有服务员,顾客无须直接和茶叶、茶具、开水等交互,整个泡茶过程由服务员来完成,顾客只需与服务员交互即可,整个过程非常简单省事,如图1(B)所示。
图1 两种喝茶方式示意图
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace 外观模式
{
class Program
{
static void Main(string[] args)
{
Waiter waiter = new Waiter();
waiter.settea("BiLuoChun");
waiter.talboilwater();
waiter.talTeaSet();
waiter.talTeaLeaf();
waiter.settea("TieGuanYin");
waiter.talboilwater();
waiter.talTeaSet();
waiter.talTeaLeaf();
waiter.settea("XiHuLongJing");
waiter.talboilwater();
waiter.talTeaSet();
waiter.talTeaLeaf();
}
}
class Tea //煮茶基类
{
public void boilwater() //煮开水
{
Console.WriteLine("煮开水");
}
public void TeaSet() //准备茶具
{
Console.WriteLine("准备茶具");
}
public virtual void TeaLeaf() { } //放入不同茶叶
}
class BiLuoChun : Tea //碧螺春类
{
public override void TeaLeaf() //放入碧螺春
{
Console.WriteLine("放入碧螺春,静候30分钟,请品尝");
}
}
class TieGuanYin : Tea //铁观音类
{
public override void TeaLeaf() //放入铁观音
{
Console.WriteLine("放入铁观音,静候30分钟,请品尝");
}
}
class XiHuLongJing : Tea //西湖龙井
{
public override void TeaLeaf()
{
Console.WriteLine("放入西湖龙井,静候30分钟,请品尝");
}
}
class Waiter
{
private Tea tea;
public void settea(string teaname) //选定茶的品种
{
tea = (Tea)Assembly.Load("外观模式").CreateInstance("外观模式."+teaname); //反射
}
public void talboilwater() //煮开水
{
tea.boilwater();
}
public void talTeaSet() //准备茶具
{
tea.TeaSet();
}
public void talTeaLeaf() //放入茶叶
{
tea.TeaLeaf();
}
}
}