FlyWeight应用:理论与实践结合

需求:在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的功能。

你可能感兴趣的:(flyweight)