어댑터 패턴 소개:
클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. 어댑터 패턴을 사용하면 호환되지 않는 인터페이스로 인해 함께 작동하지 않는 클래스가 함께 작동할 수 있습니다.
컴퓨터 프로그래밍에서 어댑터 패턴(때때로 래퍼 스타일 또는 래퍼라고도 함)은 사용자가 기대하는 대로 클래스의 인터페이스를 조정합니다. 적응을 사용하면 호환되지 않는 인터페이스로 인해 일반적으로 함께 작동하지 않는 클래스가 기존 클래스에 클래스 자체 인터페이스를 래핑하여 함께 작동할 수 있습니다.
어댑터 패턴 구조 다이어그램:
설명할 예 소개:
모든 세트에서 데모 설명으로 로깅 프로그램 사용 소프트웨어 소프트웨어에 해당 로그 관리 모듈이 있습니다. 개발 소프트웨어에서 로그인을 위해 타사 로그 구성 요소를 사용하는 경우 프로그램은 Log.Write("write log") 방법을 사용합니다. Log.Write() 메서드를 사용하여 로깅하는 데 인스턴스화된 다수의 저널 기록 개체가 사용됩니다. 그러나 타사 로그 구성 요소는 더 이상 무료가 아니며 요금이 부과되므로 새로운 로그 관리 모듈을 사용할 계획입니다. 우리가 제공하는 API 인터페이스는 Log.WriteLog("로그를 작성하는 새로운 방법")를 사용합니다. 이때 마이그레이션 변경을 어떻게 처리해야 하는지에 대한 의문이 생깁니다
클래스 어댑터 패턴
1. 원래 로그 인터페이스는 Write("write log") 메소드를 사용합니다
./// <summary> /// 原来的日志记录接口 /// </summary> public interface ILogTarget { /// <summary> /// 原来的写日志方法 /// </summary> void Write(string info); }
2. 그러나 현재 로깅 인터페이스는 WriteLog("write log")를 사용하여 파일 및 데이터베이스에 로그를 쓰는 새로운 방법을 구현합니다.
/// <summary> /// 抽象写日志类 /// </summary> public abstract class LogAdaptee { /// <summary> /// 写日志 /// </summary> public abstract void WriteLog(string info); }
/// <summary> /// 写文件日志记录 /// </summary> public class FileLog:LogAdaptee { /// <summary> /// 写日志到文件中 /// </summary> public override void WriteLog(string info) { Console.WriteLine("记录到文本文件:"+info); } }
/// <summary> /// 往数据库中写日志 /// </summary> public class DatabaseLog:LogAdaptee { /// <summary> /// 重写写日志方法 /// </summary> public override void WriteLog(string info) { Console.WriteLine("记录到数据库:"+info); } }
3. 원래 로그 작성 방식을 두 개의 새로운 개체의 메서드로 바꾸는 방법은 무엇입니까?
/// <summary> /// 采用新的写日志的方式,写入到数据库中 /// </summary> public class DatabaseLogAdapter:DatabaseLog,ILogTarget { /// <summary> /// 在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog /// </summary> public void Write(string info) { WriteLog(info); } }
/// <summary> /// 采用新的写日志的方式,写入到文本文件 /// </summary> public class FileLogAdapter : FileLog, ILogTarget { /// <summary> /// 在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog /// </summary> public void Write(string info) { this.WriteLog(info); } }
4. 원래 로깅 방법을 기반으로 호출했지만 실제로는 새 로깅 방법이 사용되었습니다.
/// <summary> /// 类 .NET 어댑터 패턴 설명(Adapter Pattern) /// </summary> class Program { static void Main(string[] args) { ILogTarget dbLog = new DatabaseLogAdapter(); dbLog.Write("程序启动成功"); dbLog = new FileLogAdapter(); dbLog.Write("程序启动成功"); } }
객체 어댑터 패턴
1. 이 메소드는 클래스 어댑터를 사용하여 새로운 로그 기능의 마이그레이션 변경 사항을 구현합니다. 두 가지 방법의 특징을 알아보세요. 로그를 작성하는 원래 방법은 동일하게 유지됩니다. Write("Write Log");
/// <summary> /// 原来的日志记录接口 /// </summary> public interface ILogTarget { /// <summary> /// 原来的写日志方法 /// </summary> void Write(string info); }
2. 현재 로그 작성 인터페이스는 WriteLog("를 사용합니다. 로그 쓰기"); 로그를 작성하는 새로운 방법을 구현합니다: 파일 및 데이터베이스에 로그 쓰기:
/// <summary> /// 抽象写日志类 /// </summary> public abstract class LogAdaptee { /// <summary> /// 写日志 /// </summary> public abstract void WriteLog(string info); }
/// <summary> /// 写文件日志记录 /// </summary> public class FileLog:LogAdaptee { /// <summary> /// 写日志到文件中 /// </summary> public override void WriteLog(string info) { Console.WriteLine("记录到文本文件:"+info); } }
/// <summary> /// 往数据库中写日志 /// </summary> public class DatabaseLog:LogAdaptee { /// <summary> /// 重写写日志方法 /// </summary> public override void WriteLog(string info) { Console.WriteLine("记录到数据库:"+info); } }
3. 위에서 FileLog, DatabaseLog 및 ILogTarget 인터페이스를 상속하는 FileLogAdapter 클래스와 DatabaseLogAdapter 클래스를 추가하고 Write 메서드를 다시 작성하여 새로운 로그 작성 메서드 WriteLog를 호출하고 이 메서드를 사용하여 마이그레이션 변경을 수행했습니다. 아래의 객체 적응 사용:
/// <summary> /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。 /// </summary> public class LogAdapter:ILogTarget { /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adaptee; public LogAdapter(LogAdaptee adaptee) { this._adaptee = adaptee; } public void Write(string info) { _adaptee.WriteLog(info); } }
4. 프로그램 호출:
/// <summary> /// 对象.NET 어댑터 패턴 설명(Adapter Pattern) /// </summary> class Program { static void Main(string[] args) { ILogTarget dbLog = new LogAdapter(new DatabaseLog()); dbLog.Write("程序启动成功"); ILogTarget fileLog = new LogAdapter(new FileLog()); fileLog.Write("程序启动成功"); } }
둘 사이의 마이그레이션 변경 사항을 비교해 보면, 클래스 적응 방법에서 우리가 얻은 어댑터 클래스 DatabaseLogAdapter 및 FileLogAdapter는 상속받은 상위 클래스의 모든 동작을 가지며 ILogTarget 인터페이스의 모든 동작도 갖습니다. 사실, 이는 객체 지향 설계 원칙에서 클래스의 단일 책임 원칙을 위반하는 반면, 객체 어댑터는 객체 지향 정신에 더 부합하므로 클래스 적응은 실제 응용 프로그램에서는 권장되지 않습니다. 로그를 기록할 때 파일과 데이터베이스에 동시에 쓰고자 하는 적응된 클래스를 가정하고 객체 어댑터를 사용하여 다음과 같이 작성합니다.
/// <summary> /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。 /// </summary> public class LogAdapter:ILogTarget { /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adapteed; /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adapteef; public LogAdapter(LogAdaptee adapteed, LogAdaptee adapteef) { this._adapteed = adapteed; this._adapteef = adapteef; } public void Write(string info) { _adapteed.WriteLog(info); _adapteef.WriteLog(info); } }
전화:
/// <summary> /// 对象.NET 어댑터 패턴 설명(Adapter Pattern) /// </summary> class Program { static void Main(string[] args) { //同时写日志到文件和数据库 ILogTarget dbLog = new LogAdapter(new FileLog(), new DatabaseLog()); dbLog.Write("程序启动成功"); } }
대신 클래스 어댑터를 사용하는 경우: 목표를 달성하기 위해 이 작성 방법을 사용합니까?
public class DatabaseLogAdapter : DatabaseLog, FileLog, ILogTarget { public void Write(string info) { this.WriteLog(info); } }
한 클래스에 기본 클래스가 여러 개 있을 수 없다는 것은 절대 불가능합니다. 다양한 상황에서는 적응형 스케줄링을 수행하기 위해 적절한 방법을 사용해야 합니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.