装饰器模式 - 访问包装的 ConcreteComponent 值

问题描述

我目前正在研究使用装饰器模式的示例。 我当前的代码如下所示:

abstract class LibraryItem

    {
        private int _numcopies;

        // Property

        public int Numcopies
        {
            get { return _numcopies; }
            set { _numcopies = value; }
        }

        public abstract void display();
    }

    /// <summary>

    /// The 'ConcreteComponent' class

    /// </summary>

    class Book : LibraryItem

    {
        private string _author;
        private string _title;

        // Constructor

        public Book(string author,string title,int numcopies)
        {
            this._author = author;
            this._title = title;
            this.Numcopies = numcopies;
        }

        public override void display()
        {
            Console.WriteLine("\nBook ------ ");
            Console.WriteLine(" Author: {0}",_author);
            Console.WriteLine(" Title: {0}",_title);
            Console.WriteLine(" # copies: {0}",Numcopies);
        }
    }

    /// <summary>

    /// The 'ConcreteComponent' class

    /// </summary>

    class Video : LibraryItem

    {
        private string _director;
        private string _title;
        private int _playTime;

        // Constructor

        public Video(string director,int numcopies,int playTime)
        {
            this._director = director;
            this._title = title;
            this.Numcopies = numcopies;
            this._playTime = playTime;
        }

        public override void display()
        {
            Console.WriteLine("3");
            
            Console.WriteLine("\nVideo ----- ");
            Console.WriteLine(" Director: {0}",_director);
            Console.WriteLine(" Title: {0}",Numcopies);
            Console.WriteLine(" Playtime: {0}\n",_playTime);
        }
    }

    /// <summary>

    /// The 'Decorator' abstract class

    /// </summary>

    abstract class Decorator : LibraryItem

    {
        protected LibraryItem libraryItem;

        // Constructor

        public Decorator(LibraryItem libraryItem)
        {
            this.libraryItem = libraryItem;
        }

        public override void display()
        {
            Console.WriteLine("2");
            libraryItem.display();
        }
    }

    /// <summary>

    /// The 'ConcreteDecorator' class

    /// </summary>

    class Borrowable : Decorator

    {
        protected List<string> borrowers = new List<string>();

        // Constructor

        public Borrowable(LibraryItem libraryItem)
          : base(libraryItem)
        {
        }

        public void BorrowItem(string name)
        {
            borrowers.Add(name);
            libraryItem.Numcopies--;
        }

        public void ReturnItem(string name)
        {
            borrowers.Remove(name);
            libraryItem.Numcopies++;
        }

        public override void display()
        {
            Console.WriteLine("1");
            // base.display();
            this.libraryItem.display();
            
            foreach (string borrower in borrowers)
            {
                Console.WriteLine(" borrower: " + borrower);
            }
        }
    }

现在我使用以下代码创建一个可借用装饰的视频:

Video video = new Video("Spielberg","Jaws",23,92);
Borrowable borrowvideo = new Borrowable(video);

我现在想要做的是访问借用视频对象的 Numcopies - 属性。预期值为 23,因为我在视频构造函数中指定了该值,但我得到的值为 0。

有人可以帮助我如何让程序返回 23 吗?

提前致谢!

解决方法

NumCopies 设为虚拟并覆盖装饰器基类中的行为。

关于装饰器模式的旁注: 在装饰器模式中,abstract class LibraryItem 应该是一个接口。需要装饰器来实现。