学习TerryLee的设计模式颇有感触,留下以下笔记以作日后参考。
代码
//--------------------------------------------------------
//我们常使用继承来实现类功能的扩展。
//但有时候随着需求的变化,类的扩展就会变得非常的多。
//但这不是我们所希望见到的,
//那么我们如何应对需求的变化而引起类的大量增加?
//You can use Bridge Patten.
//--------------------------------------------------------
#region 以前写的消息可以正常使用
/// <summary>
/// 消息接口
/// </summary>
abstract class AbstractMessage
{
void Show();
}
/// <summary>
/// 正常消息
/// </summary>
public class NormalMessage : AbstractMessage
{
public override void Show()
{
throw new NotImplementedException();
}
}
public class EorryMessage : AbstractMessage
{
public override void Show()
{
throw new NotImplementedException();
}
}
public class WaringMessage : AbstractMessage
{
public override void Show()
{
throw new NotImplementedException();
}
}
#endregion
#region 需求变化需要增加服务器端消息和客户端消息两种类型
#region 使用继承实现做法
public class ServerNormalMessage : NormalMessage
{
public override void Show()
{
base.Show();
}
}
public class ServerEorryMessage : EorryMessage
{
public override void Show()
{
base.Show();
}
}
public class ServerWaringMessage : WaringMessage
{
public override void Show()
{
base.Show();
}
}
public class ClientNormalMessage : NormalMessage
{
public override void Show()
{
base.Show();
}
}
public class ClientEorryMessage : EorryMessage
{
public override void Show()
{
base.Show();
}
}
public class ClientWaringMessage : WaringMessage
{
public override void Show()
{
base.Show();
}
}
#endregion
//--------------------------------------------------------
//使用继承实现固然可以,但一下增加了6个类
//如果我们再加上数据库上Message呢?
//--------------------------------------------------------
#region 使用桥接模式
#region 增加的类
public interface IMessageType
{
void Execute();
}
public class ServerMessageType : IMessageType
{
#region IMessageType Members
public void Execute()
{
throw new NotImplementedException();
}
#endregion
}
public class ClientMessageType : IMessageType
{
#region IMessageType Members
public void Execute()
{
throw new NotImplementedException();
}
#endregion
}
#endregion
#region 修改IMessage
abstract class AbstractMessage
{
public IMessageType Type { get; set; }
public virtual void Show()
{
Type.Execute();
}
}
#endregion
#region 客户端调用
public class App
{
public static void Main()
{
#region 实现服务器端Normal消息
NormalMessage serverNormalMessage = new NormalMessage();
serverNormalMessage.Type = new ServerMessageType();
serverNormalMessage.Show();
#endregion
}
}
#endregion
#endregion
#endregion