예, 그것은 올바른 접근법처럼 보입니다. 아니요, 특히 구현을 제어하는 경우 응용 프로그램과 장치 라이브러리가 인터페이스에 의존하는 것은 나쁘지 않습니다.
어떤 이유로 든 장치가 항상 인터페이스를 구현하지 않을 수도있는 경우 어댑터 패턴을 사용하고 장치의 구체적인 구현을 인터페이스에 적용 할 수 있습니다.
편집하다
다섯 번째 관심사를 해결할 때 다음과 같은 구조를 생각하십시오 (장치 정의를 제어한다고 가정합니다).
핵심 라이브러리가 있습니다. IDevice라는 인터페이스입니다.
장치 라이브러리에는 핵심 라이브러리에 대한 참조가 있으며 IDevice를 모두 구현하는 일련의 장치를 정의했습니다. 또한 다른 종류의 IDevice를 작성하는 방법을 알고있는 팩토리가 있습니다.
응용 프로그램에는 핵심 라이브러리 및 장치 라이브러리에 대한 참조가 포함됩니다. 응용 프로그램은 이제 팩토리를 사용하여 IDevice 인터페이스에 맞는 객체 인스턴스를 만듭니다.
이것은 귀하의 우려를 해결하는 많은 가능한 방법 중 하나입니다.
예 :
namespace Core
{
public interface IDevice { }
}
namespace Devices
{
using Core;
class DeviceOne : IDevice { }
class DeviceTwo : IDevice { }
public class Factory
{
public IDevice CreateDeviceOne()
{
return new DeviceOne();
}
public IDevice CreateDeviceTwo()
{
return new DeviceTwo();
}
}
}
// do not implement IDevice
namespace ThirdrdPartyDevices
{
public class ThirdPartyDeviceOne { }
public class ThirdPartyDeviceTwo { }
}
namespace DeviceAdapters
{
using Core;
using ThirdPartyDevices;
class ThirdPartyDeviceAdapterOne : IDevice
{
private ThirdPartyDeviceOne _deviceOne;
// use the third party device to adapt to the interface
}
class ThirdPartyDeviceAdapterTwo : IDevice
{
private ThirdPartyDeviceTwo _deviceTwo;
// use the third party device to adapt to the interface
}
public class AdapterFactory
{
public IDevice CreateThirdPartyDeviceAdapterOne()
{
return new ThirdPartyDeviceAdapterOne();
}
public IDevice CreateThirdPartyDeviceAdapterTwo()
{
return new ThirdPartyDeviceAdapterTwo();
}
}
}
namespace Application
{
using Core;
using Devices;
using DeviceAdapters;
class App
{
void RunInHouse()
{
var factory = new Factory();
var devices = new List<IDevice>() { factory.CreateDeviceOne(), factory.CreateDeviceTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
void RunThirdParty()
{
var factory = new AdapterFactory();
var devices = new List<IDevice>() { factory.CreateThirdPartyDeviceAdapterOne(), factory.CreateThirdPartyDeviceAdapterTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
}
}