24.클래스의 단방향 연결을 양방향으로 전환 Change Unidirectional Association to Bidirectional

각각 서로의 기능을 필요로 하는 클래스가 있는데, 링크가 한쪽 방향으로만 되어 있는 경우, 반대 방향으로 포인터를 추가하고 수정자가 양쪽 셋트를 모두 업데이트하게 변경한다.

  /*
     *  두 클래스가 서로의 기능을 사용해야 하는데 한 방향으로만 연결되어 있을 땐
     * - 역 포인터(참조)를 추가하고 두 클래스를 모두 업데이트 할 수 있게 접근 한정자를 수정하자.
     * 
     */
     
class Order
    {
        private HashSet<Customer> _customers = new HashSet<Customer>();

        public IEnumerable<Customer> Customers { get { return _customers; } }

        public void AddCustomer(Customer customer)
        {
            customer.FriendOrders.Add(this);
            _customers.Add(customer);
        }

        public void RemoveCustomer(Customer customer)
        {
            customer.FriendOrders.Remove(this);
            _customers.Remove(customer);
        }
    }
    
class Customer
    {
        private HashSet<Order> _orders = new HashSet<Order>();

        public IEnumerable<Order> orders
        {
            get { return _orders; }
        }

        internal HashSet<Order> FriendOrders
        {
            get { return _orders;  }
        }

        public void AddOrder(Order order)
        {
            order.AddCustomer(this);
        }

        public void RemoveOrder(Order order)
        {
            order.RemoveCustomer(this);
        }
    }