需求:在WinForm 上显示100多个座位,座位有三种类型:空座位、已占座位、出口座位。实现方式有三种
1:直接产生指定数量的PicutureBox控件对象,进行控制处理.
2:以Form为画板,通过计算确定每个座位的行列坐标,然后转换成对应Form的坐标点,通过Graphics的DrawImage方法画出所有的图形。
3:通过FlyWeight模式设计。
FlyWeight设计模式应用:
抽取出座位的通用属性,进行超类的定义
1、abstract class Seat
{
// Methods
abstract public void SetImageLocation(int x ,int y);
abstract public void PaintSeat(Graphics gx);
}
2、具体化三大类座位的类的定义
public class ExitSeat : Seat
{
private Bitmap seatImage;
private Point location;
string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
public ExitSeatControl()
{
seatImage = new Bitmap(path + @"\exit.bmp");
}
public override void SetImageLocation(int x, int y)
{
//throw new Exception("The method or operation is not implemented.");
this.location = new Point(x, y);
}
public override void PaintSeat(Graphics gx)
{
gx.DrawImage(this.seatImage, this.location.X, this.location.Y);
}
}
已占座位 .....
空座位 ......
3、创建座位的工厂类://工厂类一般用来存储各个具体的对象。
class SeatFactory
{
// Fields
private Hashtable seats = new Hashtable();
// Constructors
public SeatFactory()
{
seats.Add("NULL", new NullSeatControl());
seats.Add("OCCUPIED", new DisableSeatControl());
seats.Add("EXIT", new ExitSeatControl());
}
// Methods
public Seat GetSeat(string key)
{
return((Seat)seats[ key ]);
}
....
}
应用:
SeatFactory seatFactory = new SeatFactory();
Seat seat = seatFactory.GetSeat("EXIT");
seat.setImageLocation(x,y); //获得Image的行列坐标
seat.paintSeat(Graphics gx);
这样就能完成多个重复座位的显示了..
个人认为效果优于第一种方法..但是与第二种方法相比较,除了代码编写的难度及数量比较少,并无太大的性能优势。
PS:感谢JAKE LIN 的指导。请大家多多提出以上实现的问题和意见。同时,个人觉得Factory类的使用应该还可以进行扩展.但是目前能力尚浅,暂时不知道如何扩展Factory的功能。